将数据与 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 与 Ensembles 的 iCloud 同步
将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错