问题
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, how 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.
回答1:
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.
来源:https://stackoverflow.com/questions/5706784/should-i-use-a-fetchedresultscontroller-for-objects-in-a-constantly-updating-rel