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

*爱你&永不变心* 提交于 2020-01-06 07:17:08

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!