objective-c - NSFetchedResultsController 缺少一些对象

标签 objective-c ios core-data

我遇到了一个奇怪的问题,NSFRC fetchedObjects 数组没有返回它应该返回的所有对象。为了给你一些上下文,我的应用程序有几个 ListView Controller ,每个都有一个 NSFRC。我正在更新委托(delegate)方法 controllerDidChangeContent 中的 ListView 。我面临的问题如下:在后台 MOC 中存储一个对象并保存它之后,controllerDidChangeContent 被调用,但我刚刚保存在后台线程中的对象没有出现在 NSFRC 中。这是我用来检查的一段代码:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    NSManagedObjectContext *context = controller.managedObjectContext;
    NSError *error = nil;
    NSArray *array = [context executeFetchRequest:controller.fetchRequest error:&error];
    if (nil != array) {
        NSUInteger count = MIN(controller.fetchedObjects.count, array.count);
        for (NSUInteger index=0; index<count; index++) {
            NSManagedObject *a = array[index];
            NSManagedObject *b = controller.fetchedObjects[index];
            // Here you will see that sometimes the objects don't match
            NSLog(@"%d: %@ <--> %@", index, [[a body] text], [[b body] text]);
        }
    }
}

我期望 NSFRC fetchedObjects 数组与手动 executeFetchRequest 返回的数组相同(我正在使用 NSFRC fetchRequest 手动获取数据)。然而,这种情况并非如此。手动 executeFetchRequest 返回的对象多于 NSFRC fetchedObjects。有谁知道发生了什么事?我已关闭 NSFRC 上的缓存,但报告了相同的行为。

谢谢!

===更新====

关于那个问题的一些更新。我认为 Core Data 中存在错误,因为我能够从 NSFRC 看到一些不一致的结果,而且能够通过涉及“触摸”相关对象的解决方法来解决问题。这是一个解释正在发生的事情的场景:

想象一下以下核心数据模型,其中: - 有 Cat 对象和 Master 对象。 - 一只猫可以有一个或多个主人。 - 主人可以拥有一只或多只猫。 - 创建第一个 NSFRC(我们称之为 NSFRC_A)以获取所有名为“Master_A”的主人的猫。谓词是 { ANY master.name == "Master_A"}。 - 创建第二个 NSFRC(我们称它为 NSFRC_B)以获取所有名为“Master_B”的主人的猫。谓词是 { ANY master.name == "Master_B"}。 - 有一个仅在 UI 线程中使用的主要托管对象上下文 - 为每个后台线程创建了一个后台管理对象上下文,使用与主管理对象上下文相同的持久存储。

名为“Cat_A”的猫在后台创建并分配给主人“Master_A”。保存后台上下文后,适当更新主上下文。此时,NSFRC_A 通知其代表发生了变化并正确报告“Cat_A”。

稍后,在后台线程中,同一只猫“Cat_A”被分配给主人“Master_B”。保存后台上下文后,适当更新主上下文。此时,NSFRC_A 通知其代表该更改并正确报告“Cat_A”。 NSFRC_B 也通知它的代表该变化但不报告“Cat_A”(它从它的 fetchedObjects 中丢失)。但是,如果我使用与 NSFRC_B 相同的 fetchRequest 手动执行提取,我可以看到返回“Cat_A”。奇怪的是,返回的“Cat_A”实例被标记为错误,这解释了为什么 NSFRC_B 不返回“Cat_A”,因为它在内存中没有看到它。

这是一个错误,因为当后台线程的更改合并到主上下文中时,我可以通过简单地将“Cat_A”关系记录到 master 来修复该行为:日志记录基本上触及对象并强制将其实现到内存。

最佳答案

这个问题似乎是 NSFRC 的限制。根据 Apple 论坛 (https://devforums.apple.com/message/765374) 上的这个帖子:“限制是实体 A 的获取结果 Controller 不会总是捕捉到实体 B 的更新,这会导致谓词改变”。为了解决这个问题,我不得不在我正在寻找的对象被合并到主线程之前弄脏它:然后 NSFRC 检测到这个变化。

关于objective-c - NSFetchedResultsController 缺少一些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829767/

相关文章:

ios - 使用 iBeacon 触发音频

ios - 如何使用 NSURLConnection 查看为 HTTP 请求设置了哪些 header 字段(cookie)?

ios - 如何知道所有异步函数何时完成?

iphone - 如何知道应用程序使用的存储大小?

ios - 在 iOS 设备上本地解析和存储对象

ios - 如何创建具有多个字幕的表格单元格

ios - 如何减少图像宽度和高度取决于使用约束的手机?

objective-c - 使用sqlite的UIPickerView中的内存泄漏

ios - 使用并发类型 NSPrivateQueueConcurrencyType 保存上下文时出现死锁

objective-c - 使用分布式对象的进程之间的通信