开发者

Should I Use a FetchedResultsController for Objects in a Constantly Updating Relationship?

I have a simple Coredata model with one entity called "conversation" and the other one "messages". Basically, I need to kind of reproduce the iPhone sms application.

I have a to-one relationship from message to conversation and a to-many from conversation to messages.

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

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

Anytime I launch my app, all my conversation are loaded in my fetchedResultsController. If I understood correctly how Coredata works, as I have a relationship, every messages linked to my conversation will be loaded as well right? I set up a batch size so that I don't load all my conversations at the same time.

My app is connected to a server via a long pulling request, so I can receive an message from the server at any time (there will be added to coredata and then I use NSNotification to tell my views something append).

MY problem is this: When I select a row, I push another view on the stack, so that I can see my messages. I was wondering how to do that, and there is why:

• I could pass to my view my NSSet of messages given via the relationship, right? however, as I can receive a message, while looking at that view, h开发者_开发问答ow do i refresh the NSSet passed to the view?

• I could also use another fetchedresultController in that view, but in that case, I would be pre-loading all my messages in my previous view for no reason ? Can I tell coredata not to load them in my previous view?

I hope this was clear enough. I kind of desperate and I know there are some expert on that website. Let me know if you need anything else, I'll try to provide more information as soon as possible.


If I understood correctly how Coredata works, as I have a relationship, every messages linked to my conversation will be loaded as well right?

The Message objects themselves are not loaded until you query the relationship. Until then they are at most just faults (ghost placeholders.)

Normally, you would simply pass the Conversation object that the user selected in the first table. In the second tableview controller, you would then ask that Conversation object for it's related messages. Then you would sort them into an array for display.

However, if you have a circumstance in which the messages relationship is constantly being updated with new Message objects, then you might want to use a NSFetchedResultsController (FRC) just because you get all the automatic notifications of newly updated Message objects.

To do this, you would pass the Conversation object as above and then use it in the predicate for the FRC like so:

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

Then implement the FRC delegate methods as usual.

Of course, you can just register the second tableview controller for NSManagedObjectContextObjectsDidChangeNotification from the context and handle all this directly but for a novice the FRC might be easier.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜