6

首先,我创建一个NSFetchedResultsController用于NSFetchRequest获取实体“Entity”的所有对象的 a。

然后我插入一个新的 NSManagedObject A ,它是“Entity”的一个实例,以及 Edit B,它也是“Entity”的一个实例。

然后我打电话NSArray *result = [fetchedResultsController -fetchedObjects],结果会是A和B吗?

在整个项目中,我只使用了一个NSManagedObjectContext。

如果我这样做了,这在其Document中意味着什么?

fetchedObjects 提取的结果。

@property (nonatomic, readonly) NSArray *fetchedObjects Discussion 如果 performFetch: 没有被调用,该属性的值为 nil。

结果数组仅包含由获取请求 (fetchRequest) 指定且与其谓词匹配的实体的实例。(如果获取请求没有谓词,则结果数组包括获取请求指定的实体的所有实例。)

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

4

3 回答 3

10

最后一句话的意思

...但是,返回的数组不会随着托管对象的插入、修改或删除而更新。

是(基于我的实验):如果您存储对获取的对象的引用

NSArray *result = [fetchedResultsController fetchedObjects];

那么如果插入、修改或删除对象,则引用的这个数组将不会更新。 result所以重点是“返回的数组不......”。

但是如果你打电话

[fetchedResultsController fetchedObjects]

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

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

  • 当上下文被显式保存时,或者
  • 在运行循环中处理更改通知时。

一旦controllerDidChangeContent:被调用,一个新的调用[fetchedResultsController fetchedObjects]返回更新的对象列表。

于 2012-11-15T10:43:19.933 回答
3

@Dwayne[fetchedResultsController.managedObjectContext processPendingChanges]如果您想在您的委托对象上即时更新,则在您的插入/删除/更新之后使用,通常在运行循环结束时调用它。

于 2013-08-08T10:16:24.867 回答
1

我也只是对此做了一个实验。似乎在此调用中更新了 fetchedObjects 的计数:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath{
}

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

@Maciek Czarnik 感谢您的解释。但是,如果我们每次都能得到更改,[fetchedResultsController.managedObjectContext processPendingChanges]就没有必要再在这里调用了。

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

谢谢。

于 2013-09-12T19:33:20.410 回答