ios - 核心数据和数据完整性 : read operations vs write operations. 如何保护?

标签 ios core-data concurrency grand-central-dispatch nsoperationqueue

我有一个我认为很简单的任务。

我有一个名为 [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/

相关文章:

iphone - IOS5 Twitter - 有没有办法保留App关联?

ios - Obj-C NSMutableArray 返回 nil

c# - 如何通过所有数据流 block 传播消息上限?

python - 使用单个终端接口(interface)处理多个客户端请求

ios - NSXMLParser didStartElement 获取 attributeDict 问题

iOS xcode 5 crashlytics 错误 - Shell 脚本调用错误 - ./Crashlytics.framework/run : Permission denied

ios - 如何正确处理 UITableView 中的可折叠部分更新(调用 -controllerDidChangeContent 期间的严重应用程序更新)

ios - 为什么我的 AmazonCredentials 对象无效?

database - 时间戳如何导致 "global deadlock"?

ios - AVAssetWriter 写入黑屏视频