gpt4 book ai didi

iphone - 核心数据合并行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:03 26 4
gpt4 key购买 nike

我试图找到这个问题的答案,但我无法从文档和 StackOverflow 中找出问题。如果已经有这样的问题,我只是没有找到它,所以将非常欢迎它作为解决方案以防万一。

我的情况是:我有两个核心数据实体,一个用户和一个驾驶执照。

User  <--- 1 to 1 ---> Driving Licence

我正在使用 Magical Record作为核心数据操作的抽象层。

我的用户类(派生自 NSManagedObject)公开了 2 个方法。

一个访问用户的单例实例(整个应用程序中唯一使用的一个):

+ (User *)currentUser {

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if ([User MR_findFirst] == nil) {

User *user = [User MR_createEntity];
user.drivingLicence = [DrivingLicence MR_createEntity];
[[user managedObjectContext] MR_save];
}
});

return [User MR_findFirst];
}

以及用于重置用户数据的方法(派生自 NSManagedObject):

- (void)resetFields
{
self.name = nil;
self.surname = nil;
....
[self.drivingLicence MR_deleteEntity];
self.drivingLicence = [DrivingLicence MR_createEntity];
[self.managedObjectContext MR_save];
}

有时,我会很随意地说,drivingLicence 字段恰好为空。resetFields 方法有时可能会被后台线程调用。

可能是为了与其他上下文合并,指令序列

   [self.drivingLicence MR_deleteEntity];
self.drivingLicence = [DrivingLicence MR_createEntity];

会导致一些困惑,使 drivingLicence 最后被删除吗?或者还有什么可能是这个意外的空值的原因?

最佳答案

当您使用 MR_createEntity 时,您隐含地使用默认上下文,通过 [NSManagedObjectContext MR_defaultContext] 访问。这样做是非常危险的,除非你绝对肯定你是从主线程调用它的。在您的示例中,如果从主线程调用所有内容并且您的 self.managedObjectContext 实例变量也指向默认上下文,则所有这些都应该正常工作。否则,您将需要明确说明您正在使用哪些上下文。 MagicalRecord 为您提供这些约定,方法是在每个需要上下文才能工作的方法末尾设置一个 inContext: 可选参数。查看 MR_createInContext: 方法并明确说明您的上下文用法

关于iphone - 核心数据合并行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com