ioscore-datansmanagedobjectnsmanagedobjectcontextnspersistentcontainer

ViewContext not receiving updates from newBackgroundContext()


There is a similar question in stack overflow already but it doesn't work for me.

There is a use case in my application where I have to observe the database changes to perform some operation. To receive updates I subscribed to NSManagedObjectContextObjectsDidChange notification (for ViewContext) and also I turned on automaticallyMergesChangesFromParent.

But, if I update or delete the object on some other context (using newBackgroundContext()), I don’t receive object did change notification but it’s working perfectly for inserting new objects.

Can you someone please guide me why it does work only for insert, not for update and delete even after enabling automaticallyMergesChangesFromParent? if it's the actual behavior, Is there any other way to solve my use case?

The documentation (in NSManagedObjectContext.h) for .automaticallyMergesChangesFromParent says:

Whether the context automatically merges changes saved to its coordinator or parent context. Setting this property to YES when the context is pinned to a non-current query generation is not supported.

What I tried

Thanks in advance!


Solution

  • "I can’t use NSFetchResultController as I use a custom view to represent the data" not true, the FRC can and should be used with any view (that shows multiple objects).

    As for why you are not receiving the NSManagedObjectContextObjectsDidChange in the case of updates (which come in as refreshed) or deletes I have a few theories:

    1. Maybe not properly called _persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES; because that causes exactly the situation you describe (receiving inserts but not updates or deletes). It should be done in the persistentContainer custom getter in your app delegate after loadPersistentStoresWithCompletionHandler (and not inside the block).

    2. Perhaps not using performBlock with your background context.

    3. Possibly not registered for the did change notification correctly.

    4. (In light of new information) Not retaining the fetched objects.

    If you would like to share some code we can help you track down the bug.