首页 文章

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

提问于
浏览
5

首先,我创建一个带有 NSFetchRequestNSFetchedResultsController ,它获取实体"Entity"的所有对象 .

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

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

在整个项目中,我使用 only one NSManagedObjectContext .

如果我这样做,这在_2664147中意味着什么?

fetchedObjects获取的结果 . @property(nonatomic,readonly)NSArray * fetchedObjects讨论如果尚未调用performFetch:,则属性的值为nil . 结果数组仅包含由获取请求(fetchRequest)指定的实体的实例,并且与其谓词匹配 . (如果获取请求没有谓词,则结果数组包括获取请求指定的实体的所有实例 . )结果数组反映控制器的托管对象上下文中托管对象的内存中状态,而不是它们在持久存储 . 但是,返回的数组不会在插入,修改或删除托管对象时更新 .

3 回答

  • 3

    最后一句话的意思

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

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

    NSArray *result = [fetchedResultsController fetchedObjects];
    

    如果插入,修改或删除对象,则 result 引用的此数组将不会更新 . 所以重点是“ returned array 不......” .

    但如果你打电话

    [fetchedResultsController fetchedObjects]
    

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

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

    • 明确保存上下文时,或

    • 在运行循环中处理更改通知时 .

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

  • 9

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

  • 1

    我刚刚做了一个实验 . 似乎在此调用中更新了fetchedObjects的计数:

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

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

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

    如果可能的话,我希望我可以让别人证实这个行为 .

    谢谢 .

相关问题