2010-09-01 80 views
2

這是我的第一個問題,請原諒我是否犯了錯誤!在後臺調用代理的方法

在我的iPhone項目中,我有一個方法運行在一個需要很長時間才能執行的線程中(這就是爲什麼它在一個線程中運行的原因)。

[NSThread detachNewThreadSelector:@selector(methodToBeCalledInAThread) toTarget:self withObject:nil]; 

// ... 

-(void)methodToBeCalledInAThread { 
    MyClass *myClass = [[MyClass alloc] init]; 
    [myClass setDelegate:self]; 
    [myClass veryIntensiveComputing]; 
    [myClass release]; 
} 

我的目標是通知ViewController調用此方法中進行的任何進度的方法。這就是爲什麼我將ViewController設置爲類的委託。

現在,在昂貴的方法,我做到以下幾點:

if(self.delegate != nil) { 
    [self.delegate madeSomeProgress]; 
} 

但不幸的是,這並不工作,因爲(我認爲),我在後臺線程。

我該如何實現以異步方式執行的方法通知代理的任何更改?

回答

4

嘗試[self.delegate performSelectorOnMainThread: @selector(madeSomeProgress) withObject: nil waitUntilDone: YES]; ....

documentation for details

這將同步在主線程上執行操作。只要沒有什麼在主線程中試圖執行那個輔助線程中的東西,這樣做大多是安全的。

但是如果你不想阻塞計算直到主線程爲請求提供服務,你可以通過NO來不等待。如果你這樣做,那麼你也必須擔心線程同步。主線程可能不會立即爲請求提供服務,並且當它發生這種情況時,後臺線程可能正處於變化狀態的過程中。

線程很難。

+0

的確,他們是。 ;)幾分鐘前,我發現了performSelectorOnMainThread方法。 我最後在background-thread-class中添加了另一個方法,它由「performSelectorOnMainThread」調用。所以這個方法在主線程上調用委託的方法,一切正常。謝謝! – 2010-09-01 15:36:07

相關問題