核心数据 - 将数据从子级保存到父级上下文,而不是插入所有记录

时间:2016-08-12 22:45:23

标签: ios core-data concurrency

我目前正在遇到一个核心数据问题,在该问题中,我的子上下文中保存的所有数据都不会在调用时保存到其父级。保存的记录数量各不相同,这让我相信有一些竞争条件,但经过几个小时的考虑,我没有想法。

设置儿童语境

init(managedObjectContext: NSManagedObjectContext) {
    _parentManagedObjectContext = managedObjectContext

    // initialize managed object context
    privateManagedObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)

    // configure
    privateManagedObjectContext.parentContext = _parentManagedObjectContext

    super.init()
}

创建记录

private func insertPerson(name:String, hometown:String) {
    let newPerson = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: privateManagedObjectContext) as! Person
    newPerson.name = name
    newPerson.hometown = hometown
}

保存记录

private func saveChanges(to moc:NSManagedObjectContext) {
    guard privateManagedObjectContext.hasChanges else { return }

    moc.performBlockAndWait {
        do {
            print("Saving \(moc.insertedObjects.count) objects")
            moc.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
            try moc.save()

            if let parentContext = moc.parentContext {
                self.saveChanges(to: parentContext)
            }
        } catch {
            print("[ERROR] Could not save: \((error as NSError).localizedDescription)")
        }
    }
}

当我运行代码时,我得到类似下面的内容(假设应该插入50条记录):

Saving 50 records  // privateManagedObjectContext
Saving 12 records  // _parentManagedObjectContext

同样,父母插入的记录数量也各不相同,但通常不超过10-12条记录。我一直无法找到这个问题的明确原因,但感觉就像是在父母之前没有将对象保存到孩子的竞争条件,但这就是我使用performBlockAndWait的原因。任何建议都非常感谢。

0 个答案:

没有答案