2014-01-27 37 views
2

我正在使用父/子併發模式導入大數據塊。導入是在後臺執行而不會阻塞主線程,如下所示:取消NSManagedObjectContext performBlock

NSManagedObjectContext *temporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
temporaryContext.parentContext = mainMOC; 

[temporaryContext performBlock:^{ 
    // import data … 

    // push to parent 
    NSError *error; 
    if (![temporaryContext save:&error]) { 
     // handle error 
    } 

    // save parent to disk asynchronously 
    [mainMOC performBlock:^{ 
     NSError *error; 
     if (![mainMOC save:&error]) { 
     // handle error 
     } 
    }]; 
}]; 

一切正常,但如果我需要取消數據導入?有什麼方法可以取消performBlock?

回答

1

否 - 塊和其他任何同步操作不能隱式取消。

您必須將其編程爲可取消

例如,這裏可能......將執行BLOCK分成N個調用,每個調用只做很少的工作。

0

如果其他人有同樣的問題,我的解決方案是使用兩個獨立的管理對象上下文都連接到同一個持久存儲協調器。執行繁重任務的託管對象上下文封裝在NSOperation子類中。 NSOperation可以隨時取消。蘋果公司提供的例子是link

+0

對不起 - 這是錯誤的窗扇...一個開啓,一旦開始無法取消,如果它不執行取消自己。 NSOperations有一個取消方法,但只設置操作的狀態。它必須被編程來檢查狀態 –

+0

是的,在我保存後臺上下文之前,我檢查操作是否被取消。如果它被取消,我不保存上下文。 – sash

相關問題