CoreData,线程,主要上下文和私有上下文 - 99%的时间可以工作

时间:2016-09-22 11:03:05

标签: swift core-data swift2

在我的应用中,我使用了两个上下文: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

0 个答案:

没有答案