0

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

我从消息到对话是一对一的关系,从对话到消息是一对多的关系。

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

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

每当我启动我的应用程序时,我的所有对话都会加载到我的 fetchedResultsController 中。如果我正确理解 Coredata 的工作原理,因为我有关系,那么链接到我的对话的每条消息也会被加载,对吗?我设置了批量大小,这样我就不会同时加载所有对话。

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

我的问题是:当我选择一行时,我将另一个视图推送到堆栈上,以便我可以看到我的消息。我想知道如何做到这一点,这就是为什么:

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

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

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

4

1 回答 1

5

如果我正确理解 Coredata 的工作原理,因为我有关系,那么链接到我的对话的每条消息也会被加载,对吗?

Message您查询关系之前,不会加载对象本身。在那之前,它们最多只是故障(幽灵占位符。)

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

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

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

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

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

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

于 2011-04-18T18:24:56.370 回答