取消现有核心数据实体

时间:2010-05-29 22:16:30

标签: iphone core-data unique nspredicate

我正在使用Core Data来存储很多(1000s)项目。每个项目上的一对属性用于确定唯一性,因此当新项目进入时,我会在插入之前将其与现有项目进行比较。由于传入的数据是RSS提要的形式,因此通常会有许多重复数据,而且单一步骤的成本是O(N ^ 2),这已经变得非常重要。

现在,我在迭代(可能的)新项目列表之前创建了一组现有项目。我的理论是,在第一次迭代中,所有项目都会出现故障,并假设我们没有按内存,大多数项目将在迭代过程中保持驻留。

我看到了我的选择:

  1. 使用字符串比较进行统一,迭代所有“新”项并与所有现有项进行比较(当前方法)
  2. 使用谓词根据“新”项的属性过滤现有项目集。
  3. 使用带有核心数据的谓词来确定每个“新”项的唯一性(不检索现有项集)。
  4. 选项3可能比我目前的方法更快吗?你知道更好的方法吗?

3 个答案:

答案 0 :(得分:2)

整数散列值的比较 - 生成传入RSS新闻项的组件的散列,使用谓词过滤具有相同散列属性值的所有项,并查看是否获取了任何对象 - 可能产生比每个实体中所有属性的字符串比较。

答案 1 :(得分:1)

ohhorob提出的解决方案的第三步可能是最有效的实现,如'Implementing Find-or-Create Efficiently'部分的核心数据文档中所述。也就是说,在散列属性之后对传入的项及其对应的现有项进行排序,然后在并行循环两个集合。

答案 2 :(得分:0)

根据Alex的回答,整数属性的谓词应该更快,但应该调整策略以更好地适应任务:

  1. 收集所有传入项目哈希的列表

  2. 获取与该哈希列表匹配的所有对象(仅获取哈希属性)

  3. 迭代传入的项目,跳过在获取的匹配项中具有哈希值的项目

  4. 此外,您可以获取字典结果,以避免设置您不会使用的托管对象(除非您打算更新现有对象而不是仅跳过相同的传入项目)