gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:04:58 27 4
gpt4 key购买 nike

我必须在 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/

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