On 2011-01-23, at 3:56 AM, Kenneth Baxter wrote:

> On 23 Jan, 2011,at 12:45 PM, Dave Fernandes <dave.fernan...@utoronto.ca> 
> wrote:
> 
>> 
>> Looking back at my code, I see that I just use the KVO message to know that 
>> something changed. I then re-traverse the data model to update the view. 
>> (Not the most scalable technique.)
>  
> I thought I would try that same approach. There is something unusual though - 
> if I add a child, it shows up in the array controller and the children, and 
> if I manually delete it, it is deleted from the array controller and the 
> children. 
> 
> However, if I add a child and then undo the addition, the array controller 
> has the child removed, but it is still there in the children, and all its 
> data has gone. It has not been turned into a fault, and is not marked as 
> deleted. 

This certainly doesn't sound right. The only thing I can think of is to make 
sure you call [managedObjectContext processPendingChanges] after completing all 
your changes to the data model (each event cycle).

> 
> Seeing as I can't access the data, it makes it impossible for me to do any 
> cleanup because I need to know some data from the node in order to clean up 
> properly. The only thing I can think of to overcome this is to grab the 
> object ID and refetch the object so I can tell what has been deleted. All 
> this just seems as if I must be going about this totally the wrong way, but I 
> don't know any other way of accomplishing it. I did have a look to see if I 
> could work anything out from the managed object context change notification, 
> but couldn't get anywhere there either, and also looked at what was 
> registered with the undo manager, but it didn't seem that the undo manager 
> was being told what the objects were in the undoInsertions etc. I assume it's 
> all managed in the MOC behind the scenes.
> 
> So...still stuck, and not sure where to look next.
> 
>> 
>> If your background thread can copy the necessary data, then it doesn't have 
>> to worry about it disappearing. My understanding is that accessing a 
>> potentially changing MOC from another thread is problematic at best. See Ben 
>> Trumbull's posts on this topic. Ex. March 16, 2007
>> Re: Core Data & threads [re: Ping: Look for hints for "nested transaction" 
>> problem with Core Data]
>  
> That's a scary discussion - I need to pass in my objects to the processing 
> thread so it can read them - I had no idea there would be a problem with 
> doing that. Yet another thing to learn about Core Data.
> 
> So if I understand correctly, instead of just
> 
> myObjectInMyThread.node = node;
> 
> I would have to do something like:
> 
> NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext 
> alloc] init];
> [managedObjectContext setPersistentStoreCoordinator:pscFromMainThread];
> 
> myThreadController.managedObjectContext = managedObjectContext;
> ...
> 
> // In my thread (with appropriate will/did change and memory management...), 
> where n is the node from the main MOC
> - (void)setNode:(Node *)n {
>       node = [myThreadController.managedObjectContext objectWithID:[n 
> objectID]];
> }
> 
> Is that the right sort of approach?

Aside from the fact that you are still accessing a node from the main thread's 
MOC from within the background thread, I think there might be a problem even 
with access by object ID. If you have newly created a child and have not saved 
the changes, then the object ID is "temporary" and I don't think you will be 
able to retrieve a valid object from the BG thread's MOC. So I presume you will 
have to recreate the object in the BG thread by, say, passing in a dictionary 
containing the node's data.

We are getting more and more into territory that I have no experience with. So 
I will refrain from any more conjecture in public.

> 
> You know, I could have done this project in 1/10th the time or less if I had 
> not used core data - hope it pays off  in the long term...

Yes, I still say that sometimes, but I'm still using it.

Cheers,
Dave

> 
>> 
>> 
>> The usual pattern seems to be to have a separate MOC for the background 
>> thread and echo changes to it when the MOC in the main thread changes 
>> (NSManagedObjectContextObjectsDidChangeNotification).
>> 

_______________________________________________

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