2009-11-14 77 views
1

我從NavigationController的子視圖調用NSOperation。NSOperation performSelectorOnMainThread崩潰

MyOperation *op = [[MyOperation alloc] target:self action:@selector(didFinishOperation)]; 

的操作從一個服務器加載一些數據,分析它,然後當工作完成發送

[target performSelectorOnMainThread:action withObject:nil waitUntilDone:YES]; 

。這通常是工作...

問題是,當我從導航控制器按下後退按鈕,而NSOperation正在做它的工作,應用程序崩潰,因爲該操作引用一個釋放實例。

我試圖保持操作 - 但它仍然崩潰...

在此先感謝

回答

0

在你的UIView dealloc方法,你可以取消操作並從其NSOperationQueue將其刪除。

4

Chris在正確的軌道上,但它並沒有涵蓋當您試圖取消它時操作完成的情況,它仍然會崩潰。如果操作在main中執行,取消將不會生效。

儘管如此,在你的目標被銷燬之前嘗試並取消它,但在試圖發送消息之前測試target仍然存在。此外,檢查,如果你取消嘗試發送郵件之前:

if (self.isCancelled) return; 
+0

我已經取消viewWillDisappear操作: [operationQueue cancelAllOperations] 加載視圖時,我運行了多個操作。 正如你上面提到的 - 這將取消操作,但不是如果它在主要執行。 我試過了: if(target) [target performSelectorOnMainThread:action withObject:nil waitUntilDone:YES]; 但仍然發生錯誤... – abs 2009-11-14 08:26:40

+0

我剛剛檢查了我的代碼,我的操作在嘗試通知其目標之前檢查它們是否被取消。 – ohhorob 2009-11-14 08:48:04

+0

感謝ohhorob, 做了這個工作:) – abs 2009-11-14 08:55:32