首先我创建一个NSFetchedResultsController
,其中NSFetchRequest
获取实体“实体”的所有对象。
然后我插入一个新的NSManagedObject A,它是一个“Entity”的实例,和Edit B,它也是一个“Entity”的实例。
然后我打电话给NSArray *result = [fetchedResultsController -fetchedObjects]
,结果是A和B吗?
在整个项目中,我使用只有一个 NSManagedObjectContext。
如果我这样做,这在Document中意味着什么?
fetchedObjects fetch的结果。
@property(nonatomic,readonly)NSArray * fetchedObjects讨论 如果performFetch:尚未被调用,则该属性的值为nil。
结果数组仅包含由指定的实体的实例 获取请求(fetchRequest)并匹配其谓词。 (如果 获取请求没有谓词,那么结果数组包含所有 获取请求指定的实体的实例。)
结果数组反映了托管对象的内存状态 控制器的托管对象上下文,而不是它们的状态 持久存储。但是,返回的数组不会更新为 管理对象被插入,修改或删除。
答案 0 :(得分:9)
最后一句的意思
...但是,返回的数组不会像托管对象那样更新 插入,修改或删除。
是(根据我的实验):如果存储对获取对象的引用
NSArray *result = [fetchedResultsController fetchedObjects];
然后 result
引用的此数组在插入,修改或删除对象时不会更新。
因此重点是“ 返回的数组 不会......”。
但如果你打电话
[fetchedResultsController fetchedObjects]
稍后,返回值是一个新的对象列表,包括更改。
更确切地说:如果您设置了委托,FRC会跟踪对托管对象上下文的更改并调用FRC委托函数。插入/修改/删除对象时,不会立即调用委托函数,而是
调用controllerDidChangeContent:
后,对[fetchedResultsController fetchedObjects]
的新调用将返回更新的对象列表。
答案 1 :(得分:3)
@Dwayne在插入/删除/更新后使用[fetchedResultsController.managedObjectContext processPendingChanges]
如果您希望在委托对象上进行即时更新,通常在runloop结束时调用它。
答案 2 :(得分:1)
我刚刚对此进行了实验。似乎在此调用中更新了fetchedObjects的计数:
这意味着每次调用它都是一种增量行为?在调用controllerDidChangeContent:之后,整个列表都已准备好,因为所有更改都已执行了吗?
@Maciek Czarnik感谢您的解释。但是,如果我们每次都不需要在这里调用[fetchedResultsController.managedObjectContext processPendingChanges]就可以获得更改。
我希望如果可能的话,我可以让其他人确认这个行为。
感谢。