Thanks Ben, after thought, this is indeed very logical and can be expected when 
you know Core Data. I came to the same conclusion but you phrased it much 
better than me :)


Aurélien,
Objective Decision Team




Le 21 déc. 2010 à 01:45, Ben Trumbull a écrit :

> 
> On Dec 19, 2010, at 9:49 PM, Aurélien Hugelé wrote:
> 
>> Hi!
>> 
>> I think mergeChangesFromContextDidSaveNotification: does not work as most 
>> people expect:
>> I have a mainthread and a subthread. My subthread updates a managed object 
>> (change one of the property value) and save.
>> In the mainthread, I use [mainThreadContext 
>> mergeChangesFromContextDidSaveNotification:subThreadNotification]; and it 
>> merges the main thread context as expected (binded UI is updated)
>> 
>> What is not expected is :
>> 
>> 1/ asking the main thread for its updatedObjects (just after the 
>> mergeChangesFromContext... but before the save:) does not show the changes 
>> made in the subthread! So updated objects in subthread are not seen as 
>> updated in the main thread after the mergeChangesFromContext call!
>> 2/ Saving the main thread generates a did save notification, that does not 
>> contain changes made in the subthread (and merged) !
>> 
>> The subthread is temporary (does it job in an NSOperation that terminates 
>> quickly), its context is also temporary. 
>> 
>> In the mainthread, *many* controllers are observers of the did save 
>> notification of the main thread context. How am I supposed to make them 
>> listen to changes made in a temporary, dumb, subthreaded managed context 
>> without using mergeChangesFromContext... call ???
>> 
>> I'm pertty sure, most developers expect the 
>> mergeChangesFromContextDidSaveNotification: API to really merge the data in 
>> the main thread context and set the merged updated objects as *really* 
>> updated, as if the change really occured in the main thread!
> 
> 
> The method is merging the state into the receiving context purely from the 
> perspective of results.  Deleted objects are deleted, updated objects have 
> new values, inserted objects exist.  It does not replay the individual 
> changes, nor does it guarantee any particular path or implementation for 
> getting the state of MOC B to look like the state of MOC A.  For efficiency, 
> it prefers refreshing existing objects from the PSC's cache over replaying 
> individual changes whenever possible.  
> 
> Refreshing is observable by KVO.  These objects are also noted in the 
> NSManagedObjectContextObjectsDidChangeNotification with the 
> NSRefreshedObjectsKey.  This is how NSArrayController observes these kinds of 
> events.
> 
> The objects aren't "updated" in the sense that they'll be saved again.  
> Because they won't.  They've already been saved a first time.  They *were* 
> updated, and NSManagedObjectContext's -updatedObjects reports the state about 
> next upcoming save, not the last save.
> 
> - Ben
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to