Op 19 nov. 2011, om 05:29 heeft Quincey Morris het volgende geschreven:

>> 2 - Through 'NSManagedObjectContextObjectsDidChangeNotification'
>> 
>> The objectIDs of the changed / inserted / deleted objects can be collected 
>> from this notification and forwarded to the background thread. According to 
>> Apple:
>> 
>>    "You pass the object IDs to thread A [-- my background thread --] by 
>> sending a suitable message to an object on thread A. Upon receipt, on thread 
>> A you can refetch the corresponding managed objects."
>> 
>> Here is where I miss information: The context of my background context isn't 
>> aware of the changes in the main thread context (there was no merge) and 
>> 'refetch the corresponding managed objects' won't work because the shared 
>> persistent store wasn't updated (there was no save operation from the main 
>> context)…
> 
> The MOCs are separate scratch pads. Core Data provides no connection between 
> their object graphs except via save-dependent synchronization, therefore 
> there's no Core Data solution to your problem. If you weren't using 
> NSPersistentDocument, then using Core Data -[save:] would provide a possible 
> solution, but NSDocument semantics of course prevent you from taking that 
> approach.

Hmm, not really what I wanted to hear! But it does fit in with my recent 
experiences with CoreData. I didn't quite realize NSDocument's role, but it 
makes sense.

Regardless, the statement from the documentation quoted above seems simply 
false to me.

>> At the moment I cannot find an acceptable way to merge changes from the main 
>> thread into the background thread context. Is there a solution for my use 
>> case?
> 
> It's hard to suggest a solution when the description of your scenario is so 
> general. (For example, I conclude that the main-thread operations are fairly 
> lightweight, but the background-thread operations are fairly slow or 
> intensive. Or not.)

In fact, the background thread is an audio (CoreAudio) thread -- with all that 
implies (high priority, time critical, not really under the app's control).

> I'd say it's worth taking some time to ask if Core Data is the correct 
> technology to use for this. Do the conveniences and performance 
> characteristics it provides outweigh the impedance mismatch with your 
> application?
> 
> If you must use Core Data, it's worth taking some time to ask if this 
> simplistic multi-threaded approach is the best approach. Is there a 
> single-threaded solution that would work better? Is there a multi-threaded 
> solution that uses a MOC in one thread only?

Because it's audio: alas no to both.

> If you must use multiple MOCs in multiple threads, then the simplest solution 
> may be to invent your own set of notifications (speaking generically, not 
> implying NSNotification in particular) to send update-property dictionaries 
> from the main thread to the background thread. (You could probably use a KVO 
> observer on the main thread, send change-dictionaries to the background 
> thread, and use KVC on the background thread to apply the changes, thus 
> automating the process almost completely.) This may sound horrendous, but 
> could perhaps be easier than it sounds.

I'm thinking of creating a light-weight object graph representation 
(non-managed-object) from my persistent document which contains just the info I 
need to access (read-only) from the audio thread. I could use the 
'NSManagedObjectContextObjectsDidChangeNotification' notification to update or 
refresh this representation. I think / hope this is a workable solution; my 
model isn't _that_ complicated.

For the moment I do like to hold on to the features gained by using a 
persistent document architecture, esp. undo. I didn't realize I was in for this 
much trouble when I decided to use both CoreData and CoreAudio in 1 app…

patrick
--
Patrick Machielse
Hieper Software

http://www.hieper.nl
i...@hieper.nl

_______________________________________________

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