核心数据:[NSFetchedResultsController -fetchedObjects],这个方法会反映对象的变化吗?

时间:2012-11-15 05:20:03

标签: iphone ios core-data

首先我创建一个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)并匹配其谓词。 (如果   获取请求没有谓词,那么结果数组包含所有   获取请求指定的实体的实例。)

     

结果数组反映了托管对象的内存状态   控制器的托管对象上下文,而不是它们的状态   持久存储。但是,返回的数组不会更新为   管理对象被插入,修改或删除。

3 个答案:

答案 0 :(得分:9)

最后一句的意思

  

...但是,返回的数组不会像托管对象那样更新   插入,修改或删除。

是(根据我的实验):如果存储对获取对象的引用

NSArray *result = [fetchedResultsController fetchedObjects];

然后 result引用的此数组在插入,修改或删除对象时不会更新。 因此重点是“ 返回的数组 不会......”。

但如果你打电话

[fetchedResultsController fetchedObjects]

稍后,返回值是一个新的对象列表,包括更改。

更确切地说:如果您设置了委托,FRC会跟踪对托管对象上下文的更改并调用FRC委托函数。插入/修改/删除对象时,不会立即调用委托函数,而是

  • 明确保存上下文时,或
  • 在运行循环中处理更改通知时。

调用controllerDidChangeContent:后,对[fetchedResultsController fetchedObjects]的新调用将返回更新的对象列表。

答案 1 :(得分:3)

@Dwayne在插入/删除/更新后使用[fetchedResultsController.managedObjectContext processPendingChanges]如果您希望在委托对象上进行即时更新,通常在runloop结束时调用它。

答案 2 :(得分:1)

我刚刚对此进行了实验。似乎在此调用中更新了fetchedObjects的计数:

  • (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject    atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)类型   newIndexPath:(NSIndexPath *)newIndexPath

这意味着每次调用它都是一种增量行为?在调用controllerDidChangeContent:之后,整个列表都已准备好,因为所有更改都已执行了吗?

@Maciek Czarnik感谢您的解释。但是,如果我们每次都不需要在这里调用[fetchedResultsController.managedObjectContext processPendingChanges]就可以获得更改。

我希望如果可能的话,我可以让其他人确认这个行为。

感谢。