2012-05-17 72 views
0

做一個NSManagedObject的新實例我研究了大量關於後臺線程的核心數據的帖子,我覺得我理解(在紙上)需要做什麼上。我想我們會看到。我正在將現有的OS X應用程序遷移到Core Data,並且在異步線程上遇到問題,使我的NSManagedObject的新實例出現問題。我不能在後臺線程與非主MOC

這裏是我的權利運行代碼的樣本我已經移動到後臺線程後:

NSLog(@"JSON 1"); 
NSManagedObjectContext * context = [[NSManagedObjectContext alloc] init]; 
[context setPersistentStoreCoordinator:[[NSApp delegate] persistentStoreCoordinator]]; 
asset = (MTAssetInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"Info" inManagedObjectContext:context]; 
NSLog(@"JSON 2"); 

其結果是,第一個日誌消息(@"JSON 1")被調用31次,而第二個(@"JSON 2")永遠不會被調用。該對象未被正確製作並返回。

這個Info實體的模型相當複雜,有幾個可變形的屬性可能會或可能不會正確設置。奇怪的是,在主線程上運行類似的代碼,主MOC工作得很好。沒有問題。

編輯 - 一些更多的上下文

異步調用來源於此:

for (NSNumber *sectionID in sectionsToShow) { 
    dispatch_group_async(group, queue, ^{ 
     MTAssetInfo *asset = [self assetWithRefID:[sectionID unsignedIntegerValue]]; 
     if (asset != nil) { 
      [sectionsLock lock]; 
      [sectionsTemp addObject:asset]; 
      [sectionsLock unlock]; 
     } 
    }); 
} 

assetWithRefID方法從來沒有因爲其他的代碼片段的對象返回。它永遠不會成功從後臺線程的上下文中抽取NSManagedObject。

+0

你能解釋一下你的意思嗎?結果是第一個日誌消息被調用了31次,而第二個日誌消息從未被調用。然後,如果可能的話提供其他代碼。沒有細節,很難發生什麼。謝謝。 –

+0

請添加一個調用此線程的示例。細節是獲得幫助的關鍵。 –

+0

我指的是代碼中包含的兩條NSLog消息。從字面上看,控制永遠不會超出我應該讓我的對象返回的路線。 JSON 2 NSLog消息從不執行。 – Westley

回答

1

你將不得不提供更多的信息來獲得真正的幫助,但我敢打賭,你的問題是在NSManagedDocument後臺線程中發生錯誤。

我會爲所有消息註冊一個NSNotificationCenter(名稱:nil object:nil)並將其打印出來。我敢打賭,你會發現狀態變化或錯誤信息在那裏失敗。

您可能想嘗試圍繞它的@ try/@ catch塊來查看是否拋出了異常。

也許它會給你更多的繼續。

另一個建議...... Swizzling不一定是生產工具的正確工具,但它幾乎無法用於調試。我有方法swizled幾個完整的類,以便它在每次調用之前/之後發送詳細的NSNotification。

它節省了我大量的時間,並幫助我追蹤一些邪惡的錯誤。現在,當CoreData發生某些事情時,我拿出我的一組類,將它們鏈接起來,並查看我想要的所有細節。

我知道這並不完全回答你的問題,但希望它能讓你走上正軌,這樣你就可以提供更多的信息並全部修復。

如果這對您來說太多了,請創建一個子類並實例化該子類,並使用類似的方法調用super。你可以很容易地得到整個流程的真實想法。