2010-03-12 74 views
0

我的目标是在解析已存在于缓存中的项目时放弃NSXMLParser。程序的基本流程如下所示:正确测试对象数组对象的最佳方法是什么?

1)程序启动并下载XML提要。 Feed中的每个项目都由一个自定义对象(FeedItem)表示。每个FeedItem都被添加到数组中。

2)解析完成后,数组的内容(所有FeedItem对象)都会存档到磁盘中。

下一次执行程序或者用户刷新feed时,我会再次开始解析;然而,由于缓存(数组)现在存在,因为每个项目被解析,我想看看对象是否存在于缓存中。如果确实如此,那么我知道我已经下载了所有新项目,不再需要继续解析。

我在学习的是,我认为,我不能使用indexOfObject或indexOfObjectIDenticalTo:因为这些看起来似乎是检查对象是否使用相同的内存地址(因此是相同的)。

我想要做的是看看对象的内容是否相等(或至少一些内容)。我做了一些研究,发现我可以重写IsEqual方法;然而,我真的不想迭代/枚举整个缓存内容表为每个新分析的XML FeedItem。是迭代通过收集和测试每个人的平等唯一的方式来做到这一点或有没有更好的技术,我不知道?

目前我使用下面的代码,但我知道它需要改变:
NSUInteger index = [self.feedListCache.feedList indexOfObject:self.currentFeedItem]; if(index == NSNotFound){ }

+0

'indexOfObject:'不在相同的内存地址上测试:'如果isEqual被认为是对象相等:返回YES' – testing 2010-10-25 14:39:16

回答

1

作为替代方案,也许你也可以维护一个项目的字典。 IIRC,RSS和Atom都指定每个项目都有一个唯一的密钥(或者可能只是一个链接,就RSS而言?)。如果您使用这些唯一标识符作为字典键,那么可以快速确定您是否已经看到与刚解析的项目相匹配的项目。

所以,在伪代码,它可能工作是这样的:

FeedItem* item; 
NSMutableArray* allItems; 
NSMutableDictionary* itemIndex; 

// if this is not the first run, load existing stuff into allItems and itemIndex 
// set up the parser 

while(item = [parser nextItem]) { 
    FeedItem* existingItem = [itemIndex objectForKey:[item uniqueKey]]; 
    if(existingItem == nil) { 
    // haven't seen this item before 
    [allItems addObject:item]; 
    [itemIndex setObject:item forKey:[item uniqueKey]]; 
    } 
    else { 
    // done parsing 
    break; 
    } 
} 

// clean up parser, save items to disk, etc. 

警告,虽然:它可能是有人在饲料更新项目(比如,更改标题,它已经发布后)。因此,您可能不一定希望在看到之前看到的项目时立即停止解析。上述建议的一个改进可能是比较缓存项目和新分析项目的发布日期。 (但即使这并非万无一失)。

+0

这仍然不能解决我关于遍历表。我解析的项目类型从不更新。他们只是链接。我可以使用唯一性的URL,但又一次...我仍然想知道测试平等的最佳方法。不是我应该使用什么领域......但采取什么方法。 – radesix 2010-03-12 16:03:37

+0

我建议不要试图用你的数组存储序列*和*来确定你已经看过哪一个,你使用两种数据结构:你现在需要按顺序存储你的项目的数组,*还*字典。我将编辑一些伪代码到我的答案中来说明。 – 2010-03-12 23:48:05

+0

我想我明白你在说什么......我会给这个镜头!谢谢! – radesix 2010-03-13 00:28:09

相关问题