保留对 Core Data 对象的引用不好吗?

Is it bad to keep references to Core Data objects around?

在视图控制器中保留对托管对象的引用是不好的做法吗?

我对 Core Data 比较陌生,我最近发现你不能混合来自不同上下文的托管对象,例如如果对象不属于您的上下文,则不能将它们添加到关系中。

例如,假设我们有一个经典的 Employee 实体和一个 EmployeeDetailsViewController,它保持对 Employee 对象的强引用。

我应该存储员工的 ID 而不是 Employee 对象吗?使用 ID 而不是域对象似乎很不方便,所以我想知道通常是如何完成的。

因为你没有忘记你已经存储了你的对象,没关系。
我在我的大多数应用程序中都喜欢这样做。我在开始时选择了一个主要用户,然后将其保存在 rootController 中,以避免对 CoreData 进行过多调用,因为它在程序使用期间不会更改。

如果实体在应用程序中发生变化,您将需要从 CoreData 更新保存的对象。

欢迎来到 Core Data 的世界!

首先,您的应用程序中可能有太多 NSManagedObjectContext 个实例。您的整个用户界面应该 运行 关闭 ONE 上下文。这将解决你的关系问题。

至于保留引用,保留它们没有问题 除了 当有机会从另一个线程中删除该对象时。如果您遇到在后台线程(例如从网络操作中)删除的情况,那么您可能不想保留对这些对象的强引用,因为它会让您陷入困境。

Is it a good idea to have a separate context for one kind of changes e.g. stuff coming from server, and another for e.g. user changes (made through the UI)? I'm working on an app with a "sync offline changes" kind of feature and trying to figure out how to track these two types of changes separately so that for example changes coming from server would be discarded if user modified the same object. (you can also take a look at my other question about sync) (what a lengthy comment!)

所以我遵守的规则是:

  • 如果UI;主队列上下文。没有例外
  • 如果不是UI;私有队列上下文。没有例外

我通常将我的私有队列上下文作为主队列上下文的子级,以减少我需要处理的代码量和合并。

因此您的服务器同步不是 UI 而应该是 运行 针对私有子上下文。

观看我在 MVC-N 上的演讲以进行更深入的讨论。