我正在使用NSOperation來執行一些數據的大量解析,然後返回到主線程,準備好可供我的應用程序使用的對象。我將所有操作放在單例NSOperationQueue上來處理。我這樣做是爲了控制在任何時候進行多少處理,因爲每個操作都暫時使用相當高的內存佔用量。NSOperation沒有被正確取消
所以,我有一個場景,我可以在屏幕上有幾個視圖控制器。每個視圖控制器將創建一個負載分析操作並將其添加到隊列中。我通過設置maxConcurrentOperationCount允許2個併發處理操作。每個視圖控制器都會創建一個處理操作,將其放置在單例隊列中,並將操作保留爲屬性,以便處理該操作。
如果視圖控制器需要走開響應啓動刪除操作的用戶,我用我的視圖控制器的dealloc方法中的NSOperation財產取消操作:
-(void)dealloc{
[self.currentOperation cancel];
[super dealloc];
}
在我的NSOperation子類我檢查isCancelled財產在幾個地方的isCancelled財產(主要是長時間運行工作顯著塊前),並試圖對此作出迴應:
if([self isCancelled]){
// Perform cleanup
return;
}
的問題是,在isCancelled財產評估,以FAL然後繼續操作,最終調用Core Data來嘗試檢索已刪除的數據。即使在覈心數據獲取請求之前立即進行isCancelled檢查,我也會看到這種情況。
我有一個解決方法,以防止應用程序崩潰,但我想我可能會執行錯誤。有沒有其他方式可以在操作時保持操作的句柄,以便我可以在需要時取消操作?我的方法是否沒有保留正確的操作手柄並防止它被正確取消?
如果您未覆蓋NSOperation中的cancel方法,則在調用cancel之後,isCancelled應計算爲true。確保self.currentOperation在你達到dealloc時不是零。 – Joe