我是否应该在不断更新的关系中为对象使用FetchedResultsController?

Pie*_*rre 0 core-data objective-c relationships nsfetchedresultscontroller ios

我有一个简单的Coredata模型,其中一个实体称为"会话",另一个实体称为"消息".基本上,我需要重现iPhone短信应用程序.

我有一个从消息到对话的一对一关系,以及从对话到消息的多对多关系.

Conversation{
    messages<-->>Message.conversation
}

Message{
    conversation<<-->Conversation.messages
}
Run Code Online (Sandbox Code Playgroud)

无论何时我启动我的应用程序,我的所有对话都会加载到我的fetchedResultsController中.如果我正确理解了Coredata是如何工作的,因为我有一段关系,链接到我的对话的每条消息都会被加载正确吗?我设置了批量大小,以便我不会同时加载所有对话.

我的应用程序通过长拉请求连接到服务器,因此我可以随时从服务器接收消息(将添加到coredata然后我使用NSNotification来告诉我的视图附加内容).

我的问题是:当我选择一行时,我会在堆栈上推送另一个视图,以便我可以看到我的消息.我想知道如何做到这一点,原因是:

•我可以通过关系传递给我的NSSet消息,对吧?但是,因为我可以收到一条消息,在查看该视图时,如何刷新传递给视图的NSSet?

•我也可以在该视图中使用另一个fetchedresultController,但在这种情况下,我会在我之前的视图中预先加载我的所有消息吗?我可以告诉coredata不要在我之前的视图中加载它们吗?

我希望这很清楚.我有点绝望,我知道那个网站上有一些专家.如果您还有其他需要,请告诉我,我会尽快提供更多信息.

Tec*_*Zen 5

如果我正确理解了Coredata是如何工作的,因为我有一段关系,链接到我的对话的每条消息都会被加载正确吗?

Message查询关系之前,不会加载对象本身.在那之前,它们至多只是缺点(鬼占位符).

通常,您只需传递Conversation用户在第一个表中选择的对象.在第二个tableview控制器中,您将询问该Conversation对象是否有相关消息.然后你将它们排序成一个数组进行显示.

但是,如果您的情况messages是使用新Message对象不断更新关系,那么您可能只想使用NSFetchedResultsController(FRC),因为您获得了新更新Message对象的所有自动通知.

为此,您将Conversation如上所述传递对象,然后在FRC的谓词中使用它,如下所示:

NSPredicate *p=[NSPredicate predicateWithFormat:@"conversation==%@",passedConversationObject];
Run Code Online (Sandbox Code Playgroud)

然后像往常一样实现FRC委托方法.

当然,您可以NSManagedObjectContextObjectsDidChangeNotification从上下文中注册第二个tableview控制器并直接处理所有这些,但对于新手来说,FRC可能更容易.