【发布时间】:2016-11-16 00:52:19
【问题描述】:
在基于 CoreData 的应用程序中,我通过后台 NSOperation 处理导入。因为操作在操作队列上运行,所以我利用旧版NSConfinementConcurrencyType 与NSManagedObjectContext 一起工作。在此导入操作期间,我还访问了辅助数据库的NSManagedObjectContext。由于它在操作队列上运行,所以它也使用线程限制并发类型。这多年来一直很好用,但 NSConfinementConcurrencyType 现在在 iOS 9 中已被弃用。
看来我唯一的(非弃用)选项是使用NSPrivateQueueConcurrencyType,在performBlock: 中为主要上下文执行导入,并包装对次要上下文的每次调用或来自次要上下文的NSManagedObjects performBlockAndWait: 中的上下文。此外,我必须非常小心,不要触摸来自错误队列的其他上下文中的对象。
这一行:
primaryObject.attribute = secondaryObject.attribute;
更改如下:
id secondaryObjectAttributeValue = nil;
[secondaryContext performBlockAndWait:^{
secondaryObjectAttributeValue = secondaryObject.attribute;
}];
primaryObject.attribute = secondaryObjectAttributeValue;
有没有人有更好的选择来处理同一队列中的多个NSManagedObjectContexts,而不使用NSConfinementConcurrencyType 或跳过这些乏味的performBlock: 箍?
【问题讨论】: