0
當斷層
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      for (NSDictionary* info in houses) { 
       House* house = [DataManager processJSON:info]; //this method processes JSON into Core Data objects and saves them 
       [self.data addObject:house]; 
      } 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       //update the UI based on the new House objects added to the data array 

      }); 

     }); 

我家對象有時工作,但經常的和不可預知最終是這樣的:核心數據實體使用GCD

<House: 0x17f8b420> (entity: House; id: 0x17f71e90 <x-coredata://2826DE3A-1762-4958-8402-541D2B1754FA/House/p219> ; data: <fault>) 

我相信這事做與處理上的核心數據對象後臺線程,導致某種上下文衝突。但是我找不到使用GCD核心數據的很多具體例子。我可以在這裏添加什麼建議以確保對象不是故障?

+0

您的主線程上下文是後臺線程的父上下文嗎?如果是這樣,您需要保存後臺線程上下文,以便將更改傳播到父主要上下文。 –

+0

這個問題僅限於打印對象嗎?如果您的代碼嘗試訪問某個屬性值,它們是否可用? –

回答

0

一般來說,你不應該使用一些任意隊列來調度你的核心數據方法,這些方法可以訪問特定的託管對象上下文和可能的管理對象。

特定託管對象上下文關聯到或者

  • 專用線程(NSConfinementConcurrencyType
  • 私人調度隊列NSPrivateQueueConcurrencyType
  • 主線程(NSMainQueueConcurrencyType)。

如果你的管理對象上下文與NSConfinementConcurrencyType併發策略創建的,你要記住,你創建的上下文的線程,使用此線程將消息發送到上下文,併發送消息到註冊管理對象與此背景下。

如果上下文已與NSMainQueueConcurrencyType併發策略創建,您需要確保發送到上下文信息和管理註冊此情況下將執行主線程的對象。

如果上下文已與您需要確保發送到上下文和發送到與此背景下注冊的管理對象信息將通過使用託管對象上下文的方法performBlock:preformBlockAndWait:這個私人調度隊列執行NSPrivateQueueConcurrencyType創建。

這基本上是有效的全部方法 - 特別是訪問被管理對象的屬性。只有少數例外,其中可以在任何地方執行方法而不管併發策略如何,例如, [NSManagedObject] objectID .