Cocoa NSManagedObjectContext';用户信息属性工作?

Cocoa NSManagedObjectContext';用户信息属性工作?,cocoa,core-data,Cocoa,Core Data,在当前标题中,声明为: @property (nonatomic, readonly, strong) NSMutableDictionary *userInfo NS_AVAILABLE(10_7, 5_0); 文件只是说: 返回接收者的用户信息 上下文的userInfo的目的是什么?具有可在托管对象模型中设置的userInfo字典。这里的情况似乎并非如此。它只是一种比使用关联对象更方便的临时存储吗 是否将其保存到永久存储或通过NSCoding 它是否使用与上下文的托管对象相同的线程模型

在当前标题中,声明为:

@property (nonatomic, readonly, strong) NSMutableDictionary *userInfo NS_AVAILABLE(10_7,  5_0);
文件只是说:

返回接收者的用户信息

  • 上下文的
    userInfo
    的目的是什么?具有可在托管对象模型中设置的
    userInfo
    字典。这里的情况似乎并非如此。它只是一种比使用关联对象更方便的临时存储吗

  • 是否将其保存到永久存储或通过
    NSCoding

  • 它是否使用与上下文的托管对象相同的线程模型

  • 上下文的userInfo的用途是什么? 我从几个方面对此进行了研究,不幸的是,我没有找到任何明确的结论

    • -[NSManagedObjectContext userInfo]
      上设置一个符号断点,并运行一组核心数据回归测试,这些测试使用了大部分公共API
    • 使用几个反向工程工具查看了核心数据二进制框架
    使用符号断点并没有产生太多的效果,尽管我使用的Xcode版本可能已经超过了它。看起来并没有什么东西在访问公共访问器,但考虑到核心数据的内部结构,这并不令人惊讶

    分解该方法得到了一些提示:

    void * -[NSManagedObjectContext userInfo](void * self, void * sel) {
        rsi = sel;
        rbx = self;
        if (*(int32_t *)__PF_Threading_Debugging_level != 0x0) {
                __PFAssertSafeMultiThreadedAccess_impl(rbx, rsi);
        }
        rax = *_OBJC_IVAR_$_NSManagedObjectContext._additionalPrivateIvars;
        rax = *(rbx + rax);
        rax = *(rax + 0x30);
        return rax;
    }
    
    该方法会检查并发调试是否处于活动状态,以及该方法是否在并发规则中正确使用(这回答了问题3)。该方法直接访问私有实例变量
    \u additionalPrivateIvars
    ,核心数据的其他部分从该变量读取和写入。一些更改跟踪/预测和乐观锁定方法使用此实例变量<代码>-lockObjectStore,例如,在
    NSManagedObjectContext
    上写入
    \u其他PrivateIVars

    有点奇怪,它是一个只读的
    NSMutableDictionary
    。您不能设置新的
    NSMutableDictionary
    ,但您可以很高兴地在其上设置键和值。我很容易做到这一点:

    (lldb) po [[[result managedObjectContext] userInfo] setValue:@"foo" forKey:@"bar"]
    0x0000000000000020
    
    (lldb) po [[result managedObjectContext] userInfo]
    {
        bar = foo;
    }
    
    如果没有苹果提供更详细的指导,我不想在生产代码中这样做,因为这样做可能会很危险

    它是否保存到永久存储区或通过NSCoding保存? 事实似乎并非如此,这样做也没有多大意义。持久性存储不太了解通过协调器访问它们的上下文,如果
    userInfo
    字典对存储很重要,那么应该在《原子存储编程指南》和《增量存储编程指南》中介绍

    它是否使用与上下文的托管对象相同的线程模型?
    确实如此,如果并发调试是活动的,则误用
    -userInfo
    将记录断言。

    关于此特定API的文档在这方面非常稀少(总文本为:
    接收方的用户信息。
    )。然而,
    userInfo
    字典在苹果的框架中是非常标准的。用户可以添加自定义信息,而无需创建子类(例如,请参见on
    NSNotification
    userInfo

    NSManagedObjectContext
    userInfo
    是只读的,这不是问题。不要像预期的那样将属性分配给字典:

    // useful while debugging multiple Core Data threads
    *moc.userInfo = @{@"name":@"main managed object context"};
    
    只需直接访问字典(毕竟它是可变的):


    这是一个很好很有趣的问题。谢谢你的关注。我已经投了赞成票,但仍然希望得到一个更明确的答案。你最好的办法可能是在苹果论坛上提问,或者在课堂文档中发布一个雷达,要求更多细节。
    *moc.userInfo[@"name"] = @"main managed object context"