2016-04-25 81 views
1

運行我有一個屬性:物業延遲初始化VS核心數據在主線程

@property (strong, nonatomic) NSArray *emails; 

和懶惰初始化它

- (NSArray *) emails 
{ 
    if (_emails == nil) { 
     CoreDataElement* cde = [user grabCoreDataElement]; 
     _emails = [cde.emails allObjects]; 
    } 
    return _emails; 
} 
代碼審查期間

然而有人指出,訪問核心數據應該在主線程中完成。

所以我在修改初始化至在想:

- (NSArray *) emails 
{ 
    if (_emails == nil) { 
     if (NSThread isMainThread]) 
     { 
      CoreDataElement* cde = [user grabCoreDataElement]; 
      _emails = [cde.emails allObjects]; 
     } 
     else 
     { 
      __block NSArray *result = nil; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       result = self.emails; 
      }); 
      return result; 
     } 
    } 
    return _emails; 

}

所以我的問題是:

  • (1)有必要的MainThread執法?
  • (2)上述代碼是處理延遲初始化程序和核心數據對象訪問的規範方法嗎?

回答

2

沒有一個是正確的。如果您使用的是核心數據並且代碼可能在多個線程上運行,則正確的方法是在創建管理對象上下文時使用NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType,然後在您執行任何訪問時使用performBlock:performBlockAndWait:核心數據。檢查NSThread或使用dispatch_sync最初可能不會中斷,但都違反了Core Data應該如何工作的想法。

使用這種方法,您的方法中的代碼將被打包在performBlock:performBlockAndWait:的調用中,但這不是全部。您需要在任何時候以任何方式訪問Core Data時使用這些方法 - 因此,如果要返回一組管理對象,則需要在查找這些對象的值時使用這些相同的塊調用。