将数据与 Core Data 同步

Posted

技术标签:

【中文标题】将数据与 Core Data 同步【英文标题】:Syncing data with Core Data 【发布时间】:2013-01-16 15:29:21 【问题描述】:

我正在将数据从 iTunes 写入 Core Data。

现在,第一次同步大约需要 10 秒, 但是,更新数据大约需要 30 秒。 我的电脑有一个 SSD,所以在 HDD 上它很可能会更慢。

我正在做的是,我得到了一系列歌曲,我必须为每首歌曲进行一次提取,以检查它是否已经在 Core Data 中,如果没有,我必须插入它。

知道一首歌是否已经存在的唯一方法是检查persistentID。 它基本上是一个用于识别的持久唯一 id。

我可以通过检查来查看歌曲是否已经添加

[NSPredicate predicateWithFormat:@"persistentID == %@", song.persistentID];

不是一个很聪明的主意。

你能给我什么建议来加快这个速度?

【问题讨论】:

这真的是对每首歌曲的核心数据的单独调用以检查存在吗? @Tommy 我正在为每首歌曲进行抓取。我可能会获取一次然后检查歌曲是否在数组中,但我怀疑这会快得多 它应该会快很多,尤其是当您将returnsObjectsAsFaults 设置为NO 时。否则,每次获取以及对任何获取​​的对象上的存储支持字段的第一次访问都是对持久存储的一次访问,除了 SQLite 成本之外,它被编写为线程安全的,因此您有一大堆锁定机制可以跳过。不过,我对 iTunes 和 persistentID 的细节没有足够的信心将其提升为正确的答案。 @Tommy 好的,问题是我只有persistentID,我必须再次进行谓词过滤来确定歌曲是否在数组中 @Tommy 我试图澄清我的问题中的persistentID 【参考方案1】:

首先,获取您要比较的所有歌曲的 ID。然后,您只需前往持久性商店即可获得新歌。

获取 ID,

NSArray *allIDs = [existingSongs valueForKeyPath:@"persistentID"];

然后使用这样的谓词进行提取。

[NSPredicate predicateWithFormat:@"persistentID NOT IN %@", allIDs];

【讨论】:

【参考方案2】:

第一次同步总是很短,因为它不会执行任何获取请求。

核心数据喜欢: 批量请求 小批量

对于批量请求,Mundi 完美地回答了这个问题。这个较小的集合将只是您需要更新的集合。

下一部分是指较小的批次。如果你用多线程分解它,你可以极大地加快更新速度。由于您正在保存并且我对数据集了解不够,请查看multi threaded core data tutorial on cimg。

【讨论】:

以上是关于将数据与 Core Data 同步的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Core Data 与引用的文件同步?

使用带有 Core Data 的脏标志与服务器同步

Core Data 与 Ensembles 的 iCloud 同步

将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错

如何在 Swift 中将 Core Data 与 Cloudkit 和许多设备同步

Swift 3 Core Data - 如何同步保存上下文?