2010-03-12 125 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

相關問題