在我的应用中,我使用了两个上下文:app delegate main context
和私有上下文。
私有上下文设置如下:
var privateContext: NSManagedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
privateContext.persistentStoreCoordinator = context.persistentStoreCoordinator
我还在私有上下文中设置了一个观察者,以通过主上下文触发保存:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyView.managedObjectContextDidSave(_:)), name: NSManagedObjectContextDidSaveNotification, object: self.privateContext)
我通过回调到当前的ViewController来触发数据下载。在下载过程中,我处理所有对象:
privateContext.performBlock {
// process objects
....
// now save
if self.privateContext.hasChanges {
privateDataManager.save()
}
}
私有上下文中的保存会触发观察者并调用此代码:
dispatch_async(AppUtils.GlobalMainQueue, {
self.context.mergeChangesFromContextDidSaveNotification(notification)
})
问题在于,不时所有的变化都会持续存在。不能说什么时候或为什么 - 当我调试它时总是有效...
我怎么知道我有问题?好吧,我在下载之前和之后比较对象计数。要添加更多“颜色”:
每次下载数据都会添加一些新记录。然后,应用程序选择哪些记录已过期并将其标记为删除(在记录上设置标记)。然后它在私有上下文中保存它们(新的和'要删除')。 “保存”会触发“合并到主要上下文”通知。
理论上,此通知会触发synchronous manner中的“合并”。
合并后,如果确实按顺序发生,则会有数据重新加载 - 此重新加载仅加载未设置“已删除”标记的记录。
我遇到的问题是在重新加载之前似乎并不总是发生'合并'(这是解释这个问题的唯一方法)。
我的问题,假设我的分析是正确的,是如何在重新加载之前强制合并?通知不是以同步方式发生的吗?
我想我总是可以保存私有上下文而不是触发通知,只需使用私有上下文创建通知对象并强制触发合并。但我想理解为什么上面的代码没有按预期工作。
我可以找到基于我的代码的主要来源here。