ios - 属性延迟初始化与核心数据在主线程中运行

标签 ios objective-c multithreading core-data

我有一个 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;

}

所以我的问题是:
  • (1)是否必须执行MainThread?
  • (2)上面的代码是否是处理惰性初始化程序和核心数据对象访问的规范方法?
  • 最佳答案

    这些都不对。如果使用的是Core Data,并且可能在多个线程上运行代码,则正确的方法是在创建托管对象上下文时使用NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType,然后在执行任何可访问的操作时都使用performBlock:performBlockAndWait:核心数据。最初检查NSThread或使用dispatch_sync可能不会中断,但两者都违反了Core Data关于其工作方式的想法。

    通过这种方法,您方法中的代码将被包装在对的调用中,但这并不都是。每当您以任何方式访问Core Data时都需要使用这些方法-因此,如果要返回托管对象的数组,则在查找这些对象的值时需要使用相同的块调用。

    关于ios - 属性延迟初始化与核心数据在主线程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840066/

    相关文章:

    ios - xcode 命令行构建因 com.apple.compilers.llvm.clang.1_0.compiler 失败

    iOS 退出全屏后如何触发视频继续播放?

    ios - 匹配 UIToolBar 中的 MPVolumeView 和 UISlider 垂直位置

    ios - 在单个 UICollectionView 和 UIView 中使用布局组合

    ios - UITableView 延迟加载的图像在手指关闭之前不会加载

    java - 从 ScheduleAtFixedRate 转换为 CachedThreadPool

    c# - 如何在 .NET 3.5 中从 .NET 4 功能实现 Barrier 类

    java - if 语句中线程 "main"java.util.NoSuchElementException 中出现异常

    ios - 如何从 iOS 中的 firebase 中的子节点获取数据

    ios - 连续播放多个音频文件