我有一个我认为很简单的任务。
我有一个名为 [self getPerson]
的方法,该方法从 Web 服务为 Person
发出一个简单的 GET 请求,该请求返回一些 JSON,然后将 JSON 转换为NS 管理对象。检查现有的相同 Person
NSManagedObject,如果未找到,则将 Person
保存到核心数据中。没问题。
但是,如果我连续两次触发此方法,我会得到两个 Person
NSMangedObjects 持久保存到 Core Data 中。例如:
[self getPerson];
[self getPerson]; ---> yields duplicate `Person` objects saved in core data, no good.
如何确保在 Core Data 中只保存一个 Person
对象(不允许重复)?
我知道这个问题,只是不知道如何解决。问题是我需要一笔交易。当 [self getPerson] 第一次触发时,该方法检查已经存在的相同 Person
对象,没有找到,并将新的 Person
保存到核心数据中。这是对的。当我第二次触发 [self getPerson]
时,该方法检查一个已经存在的 Person
对象,没有看到一个,然后持久化另一个 Person
对象。这是不正确的。我想做到第二次、第三次、第四次,直到第 1000 次,检查现有的 Person 对象只会在 managedObjectContext save
操作完成后发生。现在对现有对象的检查发生得如此之快(在保存完成之前)。
我需要串行队列吗?如果是这样,这应该是 dispatch_async
还是 dispatch_sync
?我什至想尝试使用 performSelectorWithDelay
技巧。
最佳答案
一旦您创建了对象,无论您是否调用保存,它都将存在于数据库中。所以你不应该创建一个已经存在的托管对象。尚不完全清楚您的代码逻辑是什么,但根据您的描述,您说您将 JSON 转换为托管对象,然后检查是否存在相同的现有对象,如果没有找到则保存。好吧,当您创建托管对象时,您已经创建了它,因此检查是否存在相同的对象为时已晚。如果尚未保存,则保存不会创建对象,它只是将其保存到商店中。
因此,首先检查是否存在具有 JSON 中属性的 person 对象,如果不存在,则创建一个托管对象。
关于ios - 核心数据和数据完整性 : read operations vs write operations. 如何保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20812213/