> On Jul 28, 2015, at 10:01 AM, Roland King <r...@rols.org> wrote:
> 
> 
>> 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. 

As Roland states, it is a bug. You can edit the scheme and add this to the 
arguments passed on launch and it crashes.

-com.apple.CoreData.ConcurrencyDebug 1

http://oleb.net/blog/2014/06/core-data-concurrency-debugging/

Dave Reed


_______________________________________________

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