2011-11-21 49 views
0

我打電話就像一個了methodA方法background.now如果我所說的從methodA.should所謂的methodB漫長的方法我單獨提到這是在background.the我之所以問這個問題是,儘管在後臺線程中調用了冗長的進程,但ui掛了一段時間。UI掛起inspite調用後臺線程漫長的方法

[self performSelectorInBackground:@selector(methodA)]; 


    -(void)methodA 
    { 
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    [self methodB]; 
    [pool drain]; 
    } 

    -(void)methodB 
    { 
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    //some lengthy process 

    [self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:NO]; 
    [pool drain]; 
    } 
    -(void)updateTable 
    { 
    [self.tableview reloadData]; 
    } 

是調用後臺方法正確的這種方式?

+0

如果的methodB只從被稱爲了methodA的NSAutoreleasePool中的methodB可能有些過分 - 你已經由一個在了methodA建立覆蓋。 – occulus

+0

當你說用戶界面掛起,你的意思是它完全沒有響應和/或動畫停止?更多細節請... – occulus

+0

我看不出任何明顯的錯誤與上面的代碼。發佈簡化的演示代碼而不是實際的代碼可能會隱藏問題的癥結所在。你能發佈更多有問題的實際代碼嗎? – occulus

回答

1

如果一個選擇器(方法)X上調用某線程(無論它是背景或主線程),即X呼叫(以常規方式)的任何選擇也是該同一線程。所以,不,你不需要調用performSelectorInBackground:methodA:每個子通話只要入口點選擇是「正確的」的線程,那麼任何它也是對「正確」的主題,包括調用其他方法。

注意,NSAutoreleasePool你的methodB設置看起來不必要的 - 你並不真的需要它,因爲你已經在methodA成立NSAutoreleasePool的範圍內。 (假設methodB只從methodA稱爲作爲例子!)

順便說一句,你放在NSLogs絕對驗證//some lengthy process實際上是把所有的時間的事情嗎?

+0

ya冗長的過程是迭代...我循環一些計算大約100次......這實際上需要時間......沒有涉及ui的東西在計算中...... – sujith1406

相關問題