核心数据:,这个方法会反映对象的变化吗?
首先我创build一个带有NSFetchedResultsController
的NSFetchRequest
,它获取实体“Entity”的所有对象。
然后插入一个新的NSManagedObject A(它是“Entity”的一个实例)和Edit B(它也是“Entity”的一个实例)。
那么我调用NSArray *result = [fetchedResultsController -fetchedObjects]
,会得到A和B的结果吗?
在整个项目中,我只使用一个 NSManagedObjectContext。
如果我这样做,这在文档中意味着什么?
fetchedObjects获取的结果。
@property(nonatomic,只读)NSArray * fetchedObjects讨论如果performFetch:没有被调用,属性的值是nil。
结果数组只包含由获取请求(fetchRequest)指定的实体的实例并且与其谓词相匹配。 (如果获取请求没有谓词,则结果数组包含由获取请求指定的实体的所有实例。)
结果数组反映了控制器托pipe对象上下文中托pipe对象的内存中状态,而不是持久性存储中的状态。 但是,返回的数组不会随着托pipe对象的插入,修改或删除而更新。
最后一句的意思
…但是,返回的数组不会随着托pipe对象的插入,修改或删除而更新。
是(基于我的实验):如果你存储一个引用到获取的对象
NSArray *result = [fetchedResultsController fetchedObjects];
那么如果插入,修改或删除对象, 则由 result
引用的此数组将不会更新。 所以重点是“ 返回的数组不…”。
但是,如果你打电话
[fetchedResultsController fetchedObjects]
以后再次,返回值是一个新的对象列表,包括更改。
更确切地说:如果您已经设置了委托,则FRC会跟踪对受pipe对象上下文的更改并调用FRC委托函数。 当插入/修改/删除对象时,不会立即调用委托函数,但是也可以
- 当上下文被显式保存时,或者
- 在运行循环中处理更改通知时。
一旦controllerDidChangeContent:
被调用,对[fetchedResultsController fetchedObjects]
的新的调用将返回更新的对象列表。
@Dwayne在插入/删除/更新之后使用[fetchedResultsController.managedObjectContext processPendingChanges]
,如果你想对你的委托对象进行即时更新,通常在runloop结束时调用它。
我刚刚也做了一个实验。 在这个调用中,似乎fetchedObjects的计数已经更新:
- (void)控制器:(NSFetchedResultsController *)控制器didChangeObject:(ID)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)typesnewIndexPath:(NSIndexPath *)newIndexPath
这是否意味着每次调用它时都是增量行为? 当controllerDidChangeContent:被调用,因为所有的改变都已经被执行了吗?
@Maciek Czarnik谢谢你的解释。 但是,如果我们每次都可以获取更改[fetchedResultsController.managedObjectContext processPendingChanges],则不必在此处调用。
如果可能的话,我希望我能让其他人确认这个行为。
谢谢。