2016-04-25 59 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时使用这些方法 - 因此,如果要返回一组管理对象,则需要在查找这些对象的值时使用这些相同的块调用。