2017-08-17 185 views
0

這是我的核心數據操作的代碼片段。大多數時候它都能正常工作。但是現在,當我添加核心數據調試參數以查看所有核心數據調用在多線程Core Data Concurrency Debugging上是否正常時,我在行上看到一個崩潰[contexts reset]; 。[managedObjectContext reset]上的核心數據崩潰;

- (void)readAllModelObjects { 

NSFetchRequest * fr = [NSFetchRequest ....] 

NSManagedObjectContext * context = [selg getChildContext]; 

    [context performBlockAndWait:^{ 

     NSArray * resultArray = [context executeFetchRequest:fr error: nil ]; 

     NSArray * nonCoreDataModelObjectsArray = [self parseCoreDataObjectsToModel: resultArray]; 

     _memberResultArray = nonCoreDataModelObjectsArray ; 

    }]; 

    [context reset]; // This is the line it crashes .  
} 


- (NSManagedObjectContet *)getChildContext { 

    NSManagedObjectContext * privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

    privateContext.parentContext = [self mainQueueManagedObjectContext]; 

    return privateContext ; 
    } 


- (NSArray *)parseCoreDataObjectsToModel:(NSArray *)cdObjectsArray { 

    // creates and initializes the model objects array (non managed object class objects) from core data objects 
    // return this array 
    } 
  • 只有一個連接到持久性存儲協調器主隊列上下文。對於爲核心數據操作創建的每個子上下文,這一個用作父項。

  • (void)readAllModelObjects按預期從後臺線程中調用。

我有以下錯誤從核心數據

CoreData`+[NSManagedObjectContext _ 
_Multithreading_Violation_AllThatIsLeftToUsIsHonor__]: 

任何提示/建議,一定會幫我找出死機,請幫助。

回答

1

更改managedObject的值時,只有在保存上下文之後,纔會保存這些更改。一旦保存了上下文,上下文就會寫入磁盤或將其推送到其父上下文。這是一種將所有變更都作爲一個單元完成的方式 - 在數據庫中說它將被稱爲交易。 reset撤銷這些更改。所以就像改變對象需要在正確的線程上完成,reset解除了更改,需要在正確的線程上完成。

在你的情況下,根本沒有必要調用reset,因爲你沒有改變上下文。上下文沒有任何將被reset撤銷的更改。如果您想撥打reset,您需要在performBlockAndWait內進行。

TD; DR[context reset]不是線程安全的,必須從正確的線程完成。

+0

請您詳細說明爲什麼在我們從核心數據中讀取對象時,調用reset是沒有用的? –