Objective c 核心数据&x2013;实例变量更新中的NSManagedObjects

Objective c 核心数据&x2013;实例变量更新中的NSManagedObjects,objective-c,cocoa,core-data,nsmanagedobject,Objective C,Cocoa,Core Data,Nsmanagedobject,假设我通过执行以下操作来获取所有实体Employee对象:NSArray*employees=[context executeFetchRequest:request error:&error] 然后我在类中设置了一个实例变量,方法是:self.allEmployees=employees 随后在我的应用程序中,我将对我的员工对象进行一些修改,但不是通过访问self.allEmployees。我正在从另一个类修改它们 我的self.allEmployees数组是否会更新为我从另一个类对emplo

假设我通过执行以下操作来获取所有实体
Employee
对象:
NSArray*employees=[context executeFetchRequest:request error:&error]

然后我在类中设置了一个实例变量,方法是:
self.allEmployees=employees

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


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

如果您更改了从获取中接收到的对象,并且没有复制它们,那么是的。 这些都是指针。 因此,您不需要执行另一个获取请求

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

从fetch请求返回的数组包含对活动托管对象的引用。除非更改不同的fetchLimit或batchSize,否则将得到一个数组,其中包含的错误对象数量与查询返回的对象数量相同

当您访问其中一个故障对象的属性时,CoreData将透明地检索所有属性的实际数据并将其返回给您

托管对象始终有其自己最近一次调用的“保存时间”值。因此,如果您对self.allEmployees进行修改,则需要在MOC上调用save,这将向所有其他employees对象广播更改


这也是KVO在NSManagedObject属性上工作的原因,因为它们不知道影响它们的所有保存的更改。

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