取消 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:自动更新与否?

NSManagedObjectContext:撤消保存操作?

声明 NSManagedObjectContext 时出错