iOS Core Data 获取新插入的、尚未保存的对象

标签 ios objective-c cocoa core-data

我必须在 CoreData 实体中批量创建一些数据(导入过程),我想在最后“提交”或在出现错误时“回滚”(因此无法在中间保存)。

问题是,例如,我需要创建一个实体“Person”,然后在这个过程中我需要重新使用该实体。但它可以在此过程之前已经存在,也可以在导入过程中创建。

因此我尝试使用谓词“(personId == 4711)”获取它。但是虽然我已经设置 [fetchRequest setIncludesPendingChanges:YES]; 它没有找到新创建的 Person 对象。

我读了这个this questionthis answer哪个州,那是不可能的?我说得对吗?

如果是这样,我该如何解决/处理这个问题?

最佳答案

据我对 CoreData 的了解,这确实是不可能的(如果我错了请纠正我)。

然而,即使这是可能的,您也永远不想在“每个对象”的基础上查询您的商店。
对大型(超过几十个)导入的性能影响是巨大的。

我对您的建议是在导入阶段创建一个由您的唯一标识符键入的字典(从商店中预取现有实体并为不存在的实体创建新实体)。

注意:您应该注意不要在多线程环境中从不同上下文执行多个插入。在这种情况下,您将需要一名协调员来防止重复。

示例:

存储内容:1 --> P1, 3 --> P3
服务响应:1 --> Data1, 2 --> Data2

算法:
响应完成后,从响应中获取所有唯一 ID --> recievedIds = @[1,2]
在创建 recievedIds 期间设置创建 personId 的映射/字典 --> 数据:
@{1 : 数据 1, 2 : 数据 2}

通过谓词从商店中获取:
[NSPredicate predicateWithFormat:@"personId IN %@",recievedIds]
从生成的数组创建字典。
在这种情况下:existingItems = @{1 : P1}

传递recievedIds中的所有ids:
1) 如果 id 存在于 existingItems 更新现有对象
2) else 创建一个新人并将数据插入到新记录中。

这只会从商店中获取一次。
而且你只保存一次。
==> 只有 2 次去商店,而不是每个对象一次

关于iOS Core Data 获取新插入的、尚未保存的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18869965/

相关文章:

ios - controllerDidChangeContent 核心数据严重应用错误

ios - 我如何使用 NSPredicate 从数组中选择一个确切的短语?

objective-c - 更改 iTunes 单击以排队而不是播放

objective-c - Objective-C/Cocoa 中客户端-服务器通信的方法

ios - 构建 Xcode 项目并检索 .app 文件?

iphone - 在 itune 配置门户中团队帐户下的不同组之间共享用于分发证书的私钥的任何问题

swift - 如何获取 Safari 中每个窗口的每个选项卡中所有打开的 URL?

cocoa - 可以使用 Xcode 或解释获取异常位置...我怎样才能同时获得两者?

ios - UIActivityViewController Copy 在 iOS 11 上复制项目两次

ios - 将 UIImageView 添加到自定义 UITableView 单元格