如何检查NSSet或NSCountedSet中的现有项?

时间:2009-05-23 02:59:35

标签: iphone objective-c cocoa cocoa-touch

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

我的问题如下:有时我只会拉一个模型并将其添加到集合中,例如说我有法拉利的库存。所以我会让我的服务器把我拉进一辆特定的法拉利,因为一个人从库存中点击了法拉利的详细视图。单独的法拉利详细视图将列出此型号可用的所有不同涂料。因此,一旦用户钻进法拉利视图,我会向服务器询问特定法拉利车型的所有油漆。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

例如,您可以使用整理后的字符串SHA1哈希值(example code)。

获取从Web服务获得的功能,并使用相同的功能从它们生成散列值。

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

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