2015-11-05 30 views
0

看起來像在Xcode7中打開-com.apple.CoreData.ConcurrencyDebug開關,即使您只是讀取屬性,也會發生多線程違規。這是預期的行爲嗎?Xcode7讀取屬性時發生ConcurrencyDebug併發衝突?

-(NSManagedObjectContext *)newPrivateManagedObjectContext 
{ 
    NSManagedObjectContext *newContext = 
    [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType>]; 
    [newContext setParentContext:<some shared MOC with NSMainQueueConcurrencyType]; 

    return newContext; 
} 

-(void)someMethod 
{ 
    NSManagedObjectContext *context = [self newPrivateContext]; 
    NSManagedObject *mo = [context objectWithID:objectID]; // concurrency voilation 
    // assuming the above worked you would still get 
    if (mo.someProperty == nil) // also a concurrency violation 
    { 
    } 
} 

目前好像Xcode是希望我們寫在performBlock*塊與NSManagedObjectContext每一個互動。也許我錯過了什麼?

回答

2

這是預期的。您正在使用NSPrivateQueueConcurrencyType,這意味着您需要必須使用performBlock:performBlockAndWait:當您做一些使用上下文時。這包括上下文中的任何方法調用(例如,您致電objectWithID:)。它還包含對由上下文管理的任何其他對象的任何調用,例如查找從上下文中獲取的對象上的屬性值。

簡而言之:這正是應該發生的情況,因爲您沒有正確使用託管對象上下文。

+0

湯姆 - 感謝您的快速響應。我幾年前就讀過,只有在分配屬性時才需要塊。我仍然可以在腦海中看到文章的各個部分......只是不記得它是哪一個。我要去坐在課堂後面一段時間。 : -/ – memmons

+0

@memmons - 不能相信你讀過的所有東西......即使在SO上;-)但是,你可以相信湯姆所說的話。 –

+0

@JodyHagins事實上,我知道湯姆的資格。這種情況讓我想起了幾個月前,當我得知花生醬事實上並不是綠色的時候(對於像我這樣的紅/綠色盲的人來說顯然是一個常見的錯誤)。我會在「我所假設的事情是真的,但絕對不是。 – memmons