在当前 header 中,它声明为:
@property (nonatomic, readonly, strong) NSMutableDictionary *userInfo NS_AVAILABLE(10_7, 5_0);
文档简单地说:
Returns the receiver’s user info.
上下文的
userInfo
的用途是什么? Other Core Data objects拥有可以在托管对象模型中设置的userInfo
字典。这里的情况似乎并非如此。它只是作为一个比使用关联对象更方便的临时存储吗?它是否保存到持久存储或通过
NSCoding
保存?它是否使用与上下文的托管对象相同的线程模型?
最佳答案
上下文的 userInfo 的用途是什么?
我通过多种方式查看了这个问题,不幸的是没有找到任何明确的信息。
- 在
-[NSManagedObjectContext userInfo]
上设置符号断点,并运行一组核心数据回归测试来执行大部分公共(public) API。 - 使用多种逆向工程工具查看了 Core Data 二进制框架。
使用符号断点并没有产生太多效果,尽管我使用的 Xcode 版本可能刚刚超出了它。似乎没有任何东西正在访问公共(public)访问器,但考虑到核心数据的内部结构,这并不令人惊讶。
反汇编该方法得到了一些提示:
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)。该方法直接访问私有(private)实例变量_additionalPrivateIvars
,Core Data的其他部分从中读取和写入。一些更改跟踪/传播和乐观锁定方法使用此实例变量。例如,-lockObjectStore
写入 NSManagedObjectContext
上的 _additionalPrivateIvars
。
有点奇怪的是,它是一个只读的 NSMutableDictionary
。您无法设置新的 NSMutableDictionary
,但您可以愉快地在其上设置键和值。我能够很轻松地做到这一点:
(lldb) po [[[result managedObjectContext] userInfo] setValue:@"foo" forKey:@"bar"]
0x0000000000000020
(lldb) po [[result managedObjectContext] userInfo]
{
bar = foo;
}
如果没有 Apple 的更详细指导,我不想在生产代码中执行此操作,因为写入此代码可能很危险。
它是否保存到持久存储或通过 NSCoding?
看起来并非如此,而且这样做也没有多大意义。持久存储对通过协调器访问它们的上下文了解不多,如果 userInfo
字典对存储很重要,则应在原子存储编程指南和增量存储编程中介绍它指南。
它是否使用与上下文的托管对象相同的线程模型?
确实如此,如果并发调试处于事件状态,滥用 -userInfo
将记录断言。
关于cocoa - NSManagedObjectContext 的 userInfo 属性如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206135/