核心数据 - 实例变量更新中的 NSManagedObjects

Posted

技术标签:

【中文标题】核心数据 - 实例变量更新中的 NSManagedObjects【英文标题】:Core Data – NSManagedObjects in instance variable update 【发布时间】:2012-12-17 09:46:03 【问题描述】:

假设我通过以下方式获取所有实体 Employee 对象:NSArray *employees = [context executeFetchRequest:request error:&error];

然后我在我的类中设置一个实例变量:self.allEmployees = employees;

然后稍后在我的应用程序中,我将对我的员工对象进行一些修改,但不是通过访问self.allEmployees。我正在从另一个班级修改它们。

我的self.allEmployees 数组是否会更新为我从另一个类对员工对象所做的更改?或者我的self.allEmployees 数组是否会处于我第一次执行提取时员工对象的状态? (我怀疑是后者)

【问题讨论】:

【参考方案1】:

您从 fetch 请求返回的数组包含对实时托管对象的引用。除非您更改不同的 fetchLimit 或 batchSize,否则您将获得一个包含与查询返回对象一样多的故障对象的数组。

当您访问这些故障对象之一的属性时,CoreData 会透明地检索所有属性的实际数据并将这些数据返回给您。

一个托管对象总是有它自己最近一次调用保存的最新值。因此,如果您对 self.allEmployees 进行修改,您需要在 MOC 上调用 save ,这会将更改广播到所有其他员工对象。

这也是 KVO 对 NSManagedObject 属性起作用的原因,因为它们会收到所有影响它们的已保存更改的通知。

【讨论】:

如果我的第一个获取请求返回 10 个对象并且我设置了我的 self.allEmployees。然后稍后在应用程序中,我又添加了 10 个员工,然后 self.allEmployees 仍然只有 10 个对象(而不是当前所有员工总数的 20 个)? 没错,NSArray 不会神奇地增长到包含所有新员工。它只会包含对从第一个 fetch 请求返回的引用。您将不得不重新获取。 还有,如果我删除了一些员工,那我需要重新获取吗?所以总而言之,将动态数据存储在属性中是一个非常糟糕的主意? 无论哪种方式,您都必须重新获取。一般来说,我建议不要将托管对象长期存储在数组中。当你需要它们时获取它们,或者通过 NSManagedObjects 的 NSSet 属性在内部也只是进行获取。 CoreData 也做了一些缓存,所以你不必担心对性能有很大的影响。简而言之:将 NSManagedObjects 的管理留给 CoreData。 :-)【参考方案2】:

如果您更改从获取中收到的对象,并且不复制它们,那么可以。 这些都是指针。 因此,您不需要再执行一次提取请求。

如果您更改员工的值,指针不会更改。 唯一改变的是实例变量或属性。

【讨论】:

以上是关于核心数据 - 实例变量更新中的 NSManagedObjects的主要内容,如果未能解决你的问题,请参考以下文章

如何将@NSManaged 对象类中的变量初始化为 JSON 值?

NSManaged 对象 initWithCoder 错误

对于 @NSManaged 变量,fileprivate 是不是足够?

属性不能被标记为@NSManaged,因为它的类型不能在 Objective-C 中表示

在 Xcode 8.2 beta 中创建 NSManaged 子类时出错

用核心数据属性填充数组