ios - 核心数据 : Do child contexts ever get permanent objectIDs for newly inserted objects?

标签 ios core-data concurrency nested nsmanagedobjectcontext

我有一个带有两个托管对象上下文设置的应用程序,如下所示:

  • 父上下文:NSPrivateQueueConcurrencyType,链接到持久存储。
  • 主上下文:NSMainQueueConcurrencyType,父上下文的子上下文。

当向主上下文插入一个新的托管对象时,我先保存主上下文,然后再保存父上下文,如下所示:

[context performBlockAndWait:^{
    NSError * error = nil;
    if (![context save: &error]) {
        NSLog(@"Core Data save error %@, %@", error, [error userInfo]);
    }
}];

[parentContext performBlock:^{
    NSError *error = nil;
    BOOL result = [parentContext save: &error];
    if ( ! result ) {
        NSLog( @"Core Data save error in parent context %@, %@", error, [error userInfo] );
    }
}];

我的理解是,manage对象在第一次创建的时候,有一个临时的objectID。然后保存主上下文,这个对象及其临时 ID 到达父上下文。然后保存父上下文。保存最后一个上下文时,父上下文中的临时 objectID 将转换为永久 objectID

所以:

  • 永久对象 ID 是否会自动传回 到主要(子)上下文?
  • 当我强制获取对象永久 ID 时 [NSManagedObjectContext obtainPermanentIDsForObjects:error:],然后后台应用程序,重新激活它,重新加载,使用主上下文的 objectWithID: 获取对象,并访问属性,我得到

    "CoreData could not fulfill a fault for ...".

这种方法有什么问题?

最佳答案

这是一个已知的错误,希望尽快修复,但一般来说,获得一个永久 ID 就足够了,前提是您在将数据保存到第一个 child 之前这样做,并且您只包括插入的对象:

[moc obtainPermanentIDsForObjects:moc.insertedObjects.allObjects error:&error]

在一些复杂的情况下,最好在创建实例后立即获得永久 ID,尤其是当您有复杂的关系时。

您如何以及何时调用 obtainPermanentIDsForObjects

我不关注有关应用程序崩溃的部分。也许更好的解释会有所帮助。

关于ios - 核心数据 : Do child contexts ever get permanent objectIDs for newly inserted objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990279/

相关文章:

ios - 崩溃:com.apple.root.utility-qos

ios - 当查询参数包含&符号时编码 NSURL

ios - 在 Swift 中完成后立即从表中删除所有行

ios - NSPredicate for NSString中的问题

multithreading - 核心数据 : warning: Unable to load class named

c++ - C++中Concurrent Queue + map的实现

Java:推送通知已发送但未收到

ios - 尽管遵循以下说明,PWA iOS Splash 仍未显示

php - SELECT 是同步的还是异步的?

c++ - 两个进程之间如何通信