取消 NSManagedObjectContext performBlock
Posted
技术标签:
【中文标题】取消 NSManagedObjectContext performBlock【英文标题】:Cancelling NSManagedObjectContext performBlock 【发布时间】:2014-01-27 11:59:10 【问题描述】:我正在使用父/子并发模式来导入大数据块。导入在后台执行,不会阻塞主线程,如下所示:
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】:否 - 块和其他任何同步操作都不能被隐式取消。
您必须将其编程为可取消
例如这里可能... 将 performBLock 拆分为 N 个调用,每个调用只做很少的工作。
【讨论】:
【参考方案2】:如果其他人有同样的问题,我的解决方案是使用两个独立的托管对象上下文,它们都连接到同一个持久存储协调器。完成繁重工作的托管对象上下文封装在 NSOperation 子类中。 NSOperation 可以随时取消。这是 Apple 提供的示例的link。
【讨论】:
对不起 - 这是错误的窗扇...一个 nsoperation,一旦开始就不能被取消,如果它没有被实现来取消自己。 NSOperations 有一个取消方法,但它只设置操作的状态。必须对其进行编程以检查状态 是的,在我保存后台上下文之前,我会检查操作是否被取消。如果它被取消,我不会保存上下文。以上是关于取消 NSManagedObjectContext performBlock的主要内容,如果未能解决你的问题,请参考以下文章
使用父 NSManagedObjectContext 时正确的工作流程
用于关系的嵌套 NSManagedObjectContext 和 NSFetchedResultsController
父/子 NSManagedObjectContext 不起作用
NSManagedObjectContext:自动更新与否?