2010-02-09 63 views
1

假設我正在做一些iPhone開發,我有一個UIViewController的子類。並且假設這個視圖控制器有一個NSOperationQueue,它在viewDidLoad中創建並在dealloc中發佈。NSInvocationOperation從視圖控制器和視圖控制器開始處置?

現在假設在這個視圖控制器處於活動狀態時的某個時刻,它會向NSOperationQueue添加一個NSInvocationOperation,並且操作隊列開始在後臺執行它。在執行時,視圖控制器被解除。

運行NSInvocationOperation會發生什麼情況?它能繼續運行並阻止視圖控制器被釋放嗎?

實施例的代碼在視圖控制器:

NSInvocationOperation *operationDoSomething = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(synchronousDoSomething:) object:nil]; 
[_operationQueue addOperation:operationDoSomething]; 
[operationDoSomething release]; 

,然後這是在我的視圖控制器的另一功能:

- (void)synchronousDoSoemthing 
{ 
    [NSThread sleepForTimeInterval:1000.0]; 
    [self finished]; 
} 
在上述例子中

所以,由時間[self finished]被調用時,視圖控制器已經從導航控制器中彈出。

回答

1

是的,這不好。由於viewcontrollers是來來往往的事情,你不應該讓他們擁有那些spwan線程的資源,當然不是NSOperationQueue

更好的方法是創建一個擁有隊列的全局(單例)對象。然後,您的viewconroller可以將自己註冊爲觀察者,以接收有關已完成任務的消息。或者只是聽取這個全局對象發出的通知。

+0

謝謝。在等待迴應時,我將自己的邏輯轉移到模型中(無論如何它應該在那裏)並解決問題。但我也想在這裏得到答案。 – marcc