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
- 在
上设置一个符号断点,并运行一组核心数据回归测试,这些测试使用了大部分公共API-[NSManagedObjectContext userInfo]
- 使用几个反向工程工具查看了核心数据二进制框架
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
字典在苹果的框架中是非常标准的。用户可以添加自定义信息,而无需创建子类(例如,请参见onNSNotification
的userInfo
)
NSManagedObjectContext
的userInfo
是只读的,这不是问题。不要像预期的那样将属性分配给字典:
// useful while debugging multiple Core Data threads
*moc.userInfo = @{@"name":@"main managed object context"};
只需直接访问字典(毕竟它是可变的):
这是一个很好很有趣的问题。谢谢你的关注。我已经投了赞成票,但仍然希望得到一个更明确的答案。你最好的办法可能是在苹果论坛上提问,或者在课堂文档中发布一个雷达,要求更多细节。
*moc.userInfo[@"name"] = @"main managed object context"