我有一个简单的Coredata模型,其中一个实体称为“会话”,另一个实体称为“消息”。基本上,我需要重现iPhone短信应用程序。
我从消息到对话以及从对话到消息的多对多关系。
Conversation{
messages<-->>Message.conversation
}
Message{
conversation<<-->Conversation.messages
}
无论何时启动我的应用程序,我的所有对话都会加载到fetchedResultsController中。如果我正确理解了Coredata是如何工作的,因为我有一段关系,链接到我的对话的每条消息都会加载正确吗?我设置了批量大小,以便我不会同时加载所有对话。
我的应用程序通过长拉请求连接到服务器,因此我可以随时从服务器接收消息(将添加到coredata,然后我使用NSNotification告诉我的视图附加内容)。
我的问题是这样的:当我选择一行时,我会在堆栈上推送另一个视图,以便我可以看到我的消息。我想知道如何做到这一点,原因是:
•我可以通过关系传递给我的观察我的NSSet消息,对吧?但是,因为我可以收到一条消息,在查看该视图时,如何刷新传递给视图的NSSet?
•我也可以在该视图中使用另一个fetchedresultController,但在这种情况下,我会毫无理由地在我之前的视图中预加载所有消息?我可以告诉coredata不要在我之前的视图中加载它们吗?
我希望这很清楚。我有点绝望,我知道那个网站上有一些专家。如果您还有其他需要,请告诉我,我会尽快提供更多信息。
答案 0 :(得分:5)
如果我正确理解了Coredata 因为我有一段感情,所以每一件事都有效 与我的对话相关联的消息 还会加载吗?
在查询关系之前,不会加载Message
个对象本身。在那之前,他们最多只是缺点(幽灵占位符。)
通常,您只需传递用户在第一个表中选择的Conversation
对象。在第二个tableview控制器中,您将询问Conversation
对象是否有相关消息。然后你将它们排序成一个数组进行显示。
但是,如果您的messages
关系一直在使用新的Message
对象进行更新,那么您可能只想使用NSFetchedResultsController(FRC)新更新的Message
个对象的通知。
为此,您将如上所述传递Conversation
对象,然后在FRC的谓词中使用它,如下所示:
NSPredicate *p=[NSPredicate predicateWithFormat:@"conversation==%@",passedConversationObject];
然后像往常一样实现FRC委托方法。
当然,您可以从上下文中为NSManagedObjectContextObjectsDidChangeNotification
注册第二个tableview控制器并直接处理所有这些,但对于新手来说,FRC可能更容易。