0

我在使用 NSFetchedResultsController 时遇到了困难,它在我第一次运行我的应用程序时返回 0 个部分,但在我随后关闭并重新加载应用程序时返回正确数量的部分。

我注意到,如果我 NSLog 数组 [[self.fetchedResultsController fetchedObjects] 描述],我会在第一次和后续时间之间得到稍微不同的结果,我希望这能帮助我找出整体问题。

第一次运行:

"<Contact: 0x1fc7a000> (entity: Contact; id: 0x1fc79cb0 <x-coredata:///Contact/tC060241D-2C37-4F78-AA69-5FBE3CB9DDFB364> ; data: {\n    email = nil;\n    emails =     (\n    );\n    name = \"AIB Dundrum\";\n    nameInitial = A;\n    parseID = nil;\n    phoneNumber = 012983777;\n    signedUp = 0;\n})"

第二轮:

"<Contact: 0x1e35f3f0> (entity: Contact; id: 0x1e2ab020 <x-coredata://FD1A50BA-9A08-452D-B4B4-2072FA1B190C/Contact/p337> ; data: <fault>)"

任何人都可以向我解释这些输出之间的区别,为什么数据在我第二次运行应用程序时会出现这样的错误,以及我如何让它第一次这样做?

谢谢

4

1 回答 1

2

在您第二次运行时,您看到了一个fault,这意味着 Core Data 知道该对象存在于图中,但除此之外它什么都不知道。它需要返回持久存储来获取其他信息,通过使用错误对象,Core Data 可以限制内存中对象图的大小。“触发故障”的一种方法是访问对象的属性之一。您可以在调试器中通过在记录联系人 NSManagedObject 的描述之前放置断点来执行此操作。命中断点后,在调试器控制台中键入以下内容。

po [myContact willAccessValueForKey:nil]这应该会触发故障,然后当您记录描述时您不会看到data: <fault>,而是所有属性及其值,这就是您在“首次运行”中看到的内容。

我不确定的一件事是为什么您会x-coredata:///Contact/tC060241D-2C37-4F78-AA69-5FBE3CB9DDFB364在 First Run 和x-coredata://FD1A50BA-9A08-452D-B4B4-2072FA1B190C/Contact/p337Second Run 中看到。我很有信心地说,似乎在 First Run 中联系人尚未保存,p337您在 Second Run 中看到的实际上代表了后备持久存储中的记录 ID。你永远不应该依赖这个 ID,但从我的调试和分析经验来看,这是我一直看到的情况。话虽如此,这就是让我相信在 First Run 中登录的联系人尚未保存在持久存储中的原因。

希望有帮助。

于 2013-01-24T05:51:31.667 回答