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

时间:2011-04-18 17:48:39

标签: objective-c ios core-data nsfetchedresultscontroller relationships

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

我从消息到对话以及从对话到消息的多对多关系。

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

  

如果我正确理解了Coredata   因为我有一段感情,所以每一件事都有效   与我的对话相关联的消息   还会加载吗?

在查询关系之前,不会加载Message个对象本身。在那之前,他们最多只是缺点(幽灵占位符。)

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

但是,如果您的messages关系一直在使用新的Message对象进行更新,那么您可能只想使用NSFetchedResultsController(FRC)新更新的Message个对象的通知。

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

NSPredicate *p=[NSPredicate predicateWithFormat:@"conversation==%@",passedConversationObject];

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

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