【问题标题】:How to check for existing item in NSSet or NSCountedSet?如何检查 NSSet 或 NSCountedSet 中的现有项目?
【发布时间】:2009-05-23 02:59:34
【问题描述】:

我目前正在将模型对象填充到 NSSet 中(也许我应该使用 NSCountedSet)。模型应该是唯一的。我所做的是将它们从 Web 服务中拉入,然后在客户端实例化它们并将它们添加到集合中。

我的问题如下:有时我只会拉出一个模型并将其添加到集合中,例如说我有法拉利的库存。因此,我会要求我的服务器将我拉入一辆特定的法拉利,因为个人点击了库存中该法拉利的详细视图。单独的法拉利细节视图将列出该车型可用的所有不同油漆。因此,一旦用户深入了解此 Ferrari 视图,我将向服务器询问适用于特定 Ferrari 模型的所有油漆。

接下来,用户退出,然后转到视图控制器,该控制器询问我为每辆车提供的所有油漆颜色。我已经收藏了法拉利油漆。现在我要从服务器上获取所有的颜料。在不重复资源的情况下,将现有涂料与所有涂料聚合的最佳方法是什么?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    您需要一种从服务器中唯一标识每个对象的方法。在数据库中,一个对象(部分或全部)可以表示为一行,并且 rowid 通常是一个单调递增的整数(尽管您的数据源可以使用其他东西)。在任何情况下,将此唯一 ID 存储在您创建的每个对象中,并在创建新对象之前检查是否存在具有该 ID 的对象。如果对象已经存在,则返回现有对象,如果不存在,则创建一个新对象,然后将其存储在缓存中。使用整数作为 id 效果很好,因为您可以使用 NSMapTable 作为缓存,其中 rowid 作为键,值是对象指针。

    【讨论】:

      【解决方案2】:

      在您的应用中维护一个NSArray*,它根据您的一些hash function 功能存储NSString* 对象:

      hashValue = hash(color + horsepower + leatherSeating + whatever...)
      

      例如,您可能会采用整理字符串 (example code) 的 SHA1 哈希。

      获取您从 Web 服务获得的特征,并使用相同的函数从中生成哈希值。

      使用-containsObject: 在您应用的哈希表中搜索网络服务值。

      如果返回YES,则执行X,否则执行Y

      【讨论】:

      • 为什么不在模型对象类中实现-hash,继续使用NSSet?
      • 如果将哈希值缓存在数组中,则每次进行比较时都不必重新计算。
      • 还有什么阻止你将 -hash 的结果缓存为类的 -hash 实现的一部分?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2013-02-17
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多