> On 28 Jul 2015, at 9:12 pm, Trygve Inda <cocoa...@xericdesign.com> wrote:
> 
> I gather that when using NSPrivateQueueConcurrencyType, all operations (a
> fetch for example) have to be done within a performBlock call.
> 

...

> Then later, this context is used outside a performBlock:
> 
> 
> NSArray *matchingQuakes = [taskContext
> executeFetchRequest:matchingQuakeRequest error:&anyError];
> 
> 
> Why does this work?

You are supposed to call performBlock so that all accesses to the MOC are 
serialized on the queue and so you get thread safety that way. However it's 
quite possible to call the methods directly on the MOC in any thread context 
and they will work, all the performBlock() actually does is queue the same 
block of code onto the dispatch queue and when it's its turn, it executes by 
calling [ moc executeFetch.. blah blah]. 

If you do that of course you have no thread safety any more and are likely to 
blow up. In this case there's only one thread (I believe) and so the accesses 
are serialized anyway and it works. It's a bad piece of code. 

I filed an enhancement report requesting that the coredata stack assert if you 
called a private queue MOC method from the wrong queue, I don't recall seeing 
anything come of it, however I do remember there is quite a lot of logging you 
can turn up on CoreData and it's possible one such log will tell you you're 
doing this. 
_______________________________________________

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:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

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

Reply via email to