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不要在我之前的视图中加载它们吗?
我希望这很清楚.我有点绝望,我知道那个网站上有一些专家.如果您还有其他需要,请告诉我,我会尽快提供更多信息.
如果我正确理解了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可能更容易.