NSFetchedResultsController misses updates on merged NSManagedObjectContext
Asked Answered
D

2

6

I have two managed object contexts, A and B. These two contexts are kept in sync by merging changes from one to the other whenever they're saved (by monitoring NSManagedObjectContextDidSaveNotification). I've verified that changes to A and B are merging properly.

I have an NSFetchedResultsController monitoring updates to B. I find that certain updates to A do not result in the nsfrc firing on B. When a new managed object is created and added to A with the attributes the nsfrc is looking for (on B), the nsfrc fires after B merges changes from the save of A. However, if the managed object already exists on A (and B), and I modify the object and save A, while I can see that B is merging the changes from the save notification of A, the nsfrc monitoring B does not fire.

What am I missing here?

Diplomatist answered 1/6, 2011 at 6:52 Comment(2)
Let me clarify that the predicate that the NSFetchedResultsController is searching for is a simple boolean attribute "marked == YES". If the nsfrc is monitoring managed object context A, it fires on these updates always. If it's monitoring B, it only sees objects added to A, not objects modified in A.Diplomatist
Is the predicate run against the B entity or the A entity?Ibnsaud
M
1

I had this problem and it seems that I've solved it. I don't know what I did exactly. I mean I did a couple of things and don't know, which one became the solution. So I will simply describe...

I've refactored my code to follow some "hints", found in official docs & some forums:

  1. If you manage NSManagedObjectContext in another thread, it should be created in that thread and not somehow passed there.
  2. You should add observer (to get save notifications for merging) in main thread only - this way they will be also merged in the main thread.
  3. (Optional, but I did it) You can try to save context in main thread only even if it was created and managed in the background thread.

1 & 3 looks more like some "magic", so I think you should try to follow 2 first. Hope this will help you.

Moniz answered 4/7, 2011 at 3:22 Comment(1)
I've since refactored my code and while this isn't the complete answer, it appears that threading issues were the root cause.Diplomatist
D
0

Not sure if this would solve your problem, but try calling processPendingChanges on context B, after changes from A are being merged.

Also, does your nsfrc use caching? Try disabling the cache and see if it makes any difference in your case...

Damalas answered 4/7, 2011 at 20:26 Comment(1)
Look at my "solution" (if it can be called so) - my NSFetchedResultsController uses caching and there are no problems now. So the problem is definitely not in caching.Moniz

© 2022 - 2024 — McMap. All rights reserved.