Ios 这是否只会用临时ID填充子上下文?

Ios 这是否只会用临时ID填充子上下文?,ios,objective-c,core-data,concurrency,Ios,Objective C,Core Data,Concurrency,我想知道是否有人能回答这个问题。我目前正在使用Marcus Zarra在其博客中描述的CoreData堆栈构建我的应用程序。他将managedObjectContext描述为真理的单一来源,所有插入/更新/删除都应在此上下文中进行。没有例外。奇怪的是,由于这个上下文是私有上下文的子上下文,如果我一直在managedObjectContext中插入新的NSManagedObjects。。。既然父上下文不刷新子上下文,那么这个上下文不是会被临时对象填充吗?我问这个问题是因为如果我只有一个临时的NSM

我想知道是否有人能回答这个问题。我目前正在使用Marcus Zarra在其博客中描述的CoreData堆栈构建我的应用程序。他将managedObjectContext描述为真理的单一来源,所有插入/更新/删除都应在此上下文中进行。没有例外。奇怪的是,由于这个上下文是私有上下文的子上下文,如果我一直在managedObjectContext中插入新的NSManagedObjects。。。既然父上下文不刷新子上下文,那么这个上下文不是会被临时对象填充吗?我问这个问题是因为如果我只有一个临时的NSManagedObject,我如何使用NSManagedObject从PSC检索这个NSManagedObject?我是否必须使用privateContext显式抛出另一个performBlock来获取它?这感觉像是一个非常不雅观的解决方案。

您可以在保存更改之前提前强制转换,如:

[moc obtainPermanentIDsForObjects:moc.insertedObjects.allObjects error:&error];
据我所知,对象已经在这两种上下文中。您不需要从存储中检索它,因为它是缓存的

您仍然拥有该对象,并且可以根据该对象的属性查询存储。唯一需要ID的是如果您需要将它传递给另一个线程,但您只有一个唯一的真相来源。还有什么别的线索

更新:

在讨论了你的应用程序之后,如果不需要增加复杂性,我建议不要增加复杂性。您已经有了一个API线程。不要试图过早地通过将API任务拆分为多线程子任务来优化它。在私有上下文之间传递ID会增加开销和不必要的负担

将后台API所做的操作视为一个操作,让它下载、插入、保存,然后通知SSoT,然后SSoT可以(重新)获取

如果反应足够灵敏,你就完了。您有一个简单、包含的方法,不需要传递ID


一般来说,除非有必要,否则不要进行优化。

我知道这个解决方案,但我从中得到了奇怪的行为。尽管确保NSManagedObject具有临时objectID,但我经常遇到EXC_BAD_访问异常。但除此之外,我认为如果你必须像那样从PSC强制查询objectID。。感觉这不是苹果最初想象的那样吗?编辑:我在save调用之前和之后都尝试过这样做。奇怪的是,在需要NSManagedObject的函数之间传递nsmanagedobjects不是更好的做法吗?它使它更加便携和线程安全,尽管代价是一些不便。现在,我只有一个主线程访问CoreData。我还使用existingObjectWithId来实例化NSManagedObject,以防我需要使用其中的数据。您的应用程序是否线程化?如果没有,只需传递
NSManagedObject
。当你的应用程序没有线程化时,你唯一需要对象ID的时间是用于状态恢复。我的应用程序是线程化的。我希望所有的长操作/服务器API调用都在一个单独的线程上完成。目前,GCD调度呼叫正在执行此操作。是的,在将永久ID传递给另一个线程之前,您需要获得永久ID,因为您无法在线程之间传递
NSManagedObjects
。更新了我的回答,建议不要在应用程序中设计不必要的复杂性。如果不需要,就不要传递ID。