取消NSManagedObjectContext performBlock

3

我正在使用父子并发模式导入大量数据块。导入是在后台进行的,不会阻塞主线程,就像这样:

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操作?

2个回答

2

不能隐式取消“no-blocks”和其他任何同步操作。

你必须编写可取消的程序。

例如,在这里,您可以将performBlock分成N个调用,每个调用只做一点工作。


1
如果有其他人遇到同样的问题,我的解决方案是使用两个独立的托管对象上下文,它们都连接到同一个持久性存储协调器。承担重要任务的托管对象上下文封装在NSOperation子类中。NSOperation可以在任何时候取消。这里是苹果提供的示例link的链接。

抱歉 - 那是错误的 sash... 一旦启动,NSOperation 就无法取消,除非它被实现为可以取消自身。NSOperation 有一个取消方法,但那只是设置操作状态。必须编程实现来检查状态。 - Daij-Djan
是的,在保存背景上下文之前,我会检查操作是否被取消。如果已经取消了,我就不会保存上下文。 - sash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接