也没有。您应该使用带谓词的NSFetchRequest
。你的模式可能会意外地错误的关系,这是非常昂贵的,不需要检查它是否包含一个对象。有些方法需要小心,而不是错误的整个关系,但它很脆弱(搜索的小改变会导致性能的巨大变化),所以最好养成使用NSFetchRequest
而不是搜索集合的习惯。我喜欢在这些情况下将我的fetchLimit
设置为1,所以一旦找到它,它就停止查找。
为方便起见,您可能需要在托管对象上创建-containsFoo:
方法,以便您不必在整个位置编写提取逻辑。
上述两个解决方案略有不同。第一个测试集合中是否有对象isEqual:
到itemOfInterest
。您的第二个解决方案测试集合中是否有与itemOfInterest
相同的内存位置中的对象。对于具有自定义isEqual:
逻辑的对象,这些可以返回不同的结果。这意味着对于非核心数据收集,解决方案2的速度可能会稍微快一些,但这是因为您实际上正在测试不同的东西,而不是因为对象枚举。 (实际上,这只适用于小型收藏;请参阅下文。)
为什么您认为解决方案1使用-objectEnumerator
?
正如@James Raybould指出的那样,出于性能原因,您通常不应该尝试重写内置方法。如果解决方案2的isEqual:
版本比解决方案1更快,您是否认为Apple会使用解决方案2中的代码实施-containsObject:
?
实际上,底层CFSet
是作为散列实现的,所以检查遏制是对数而不是线性。一般而言,对于具有合理散列函数的大集合,解决方案1将更快。请参阅CFSet.c中的代码。寻找CFSetContainsValue()
。当然,不能保证CFSet的实现保持不变,但对于理解Cocoa中通常如何处理性能问题非常有用。
我可能在这里错过了一些东西,但为什么你需要搜索呢?如果你已经有一个关系的每一边有两个对象,你已经有了你需要的信息。这是一种多对多的关系,还是一对多而没有互惠关系? – TechZen 2011-03-19 21:15:39
@ TechZen:根据用户的搜索条件进行提取。结果显示在表格中。用户通过表格对这些结果进行选择。还有另一张带有多对多关系成员的表格,并带有复选框。复选框状态必须根据是否全部,无或所选对象包含其项目来设置。可能涉及很多对象,因此使用最有效的方法很重要。感谢Raybould先生和Napier先生的建议,我确信containsObject是最佳选择。 – Wienke 2011-03-19 23:01:00