我使用父/子并发模式导入大数据块。导入是在后台执行而不会阻塞主线程,如下所示:
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?
答案 0 :(得分:2)
否 - 无法隐式取消块和其他任何同步操作。
你必须将其编程为可取消
e.g。这里也许......将performBLock分成N个调用,每个调用只做很少的工作。
答案 1 :(得分:1)
如果其他人遇到同样的问题,我的解决方案是使用两个独立的托管对象上下文,这两个上下文都连接到同一个持久性存储协调器。执行繁重工作的托管对象上下文封装在NSOperation子类中。 NSOperation可以在任何时候取消。以下是Apple提供的示例的link。