我使用父/子并发模式来导入大型数据块。导入在后台执行,而不阻塞主线程,如下所示:
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吗?
发布于 2014-01-27 12:02:52
没有块和其他任何同步操作都不能隐式取消。
你必须给它编程才能被取消
这里也许..。将performBLock分解成N个调用,每个调用只做很少的工作。
发布于 2014-01-27 16:26:19
如果其他人有同样的问题,我的解决方案是使用两个独立的托管对象上下文,它们都连接到同一个持久存储协调器。执行繁重任务的托管对象上下文封装在一个NSOperation子类中。NSOperation可以在任何时候被取消。以下是苹果提供的示例的链接。
https://stackoverflow.com/questions/21380296
复制相似问题