我有一个 property :
@property (strong, nonatomic) NSArray *emails;
和一个懒惰的初始化器
- (NSArray *) emails
{
if (_emails == nil) {
CoreDataElement* cde = [user grabCoreDataElement];
_emails = [cde.emails allObjects];
}
return _emails;
}
但是,在进行代码审查时,指出应该在主线程中完成对Core Data的访问。
所以我在考虑将初始化程序修改为:
- (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;
}
所以我的问题是:
最佳答案
这些都不对。如果使用的是Core Data,并且可能在多个线程上运行代码,则正确的方法是在创建托管对象上下文时使用NSMainQueueConcurrencyType
或NSPrivateQueueConcurrencyType
,然后在执行任何可访问的操作时都使用performBlock:
或performBlockAndWait:
核心数据。最初检查NSThread
或使用dispatch_sync
可能不会中断,但两者都违反了Core Data关于其工作方式的想法。
通过这种方法,您方法中的代码将被包装在对或的调用中,但这并不都是。每当您以任何方式访问Core Data时都需要使用这些方法-因此,如果要返回托管对象的数组,则在查找这些对象的值时需要使用相同的块调用。
关于ios - 属性延迟初始化与核心数据在主线程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840066/