2011-11-29 19 views
2

我收集了一個usertype新聞當前存儲在一個NSArray中。我必須將它們存儲在UserDefaults中以將它們保存在設備上。新聞有一個獨特的屬性ID。在將它們存儲到UserDefaults之前,我將NSArray轉換爲NSDictionary,其中的鍵是ID,此鍵的對象是News。這是存儲它們的好方法嗎?用於存儲在UserDefaults中的NSArray或NSDictionary?

選擇NSDictionary的原因是能夠檢查每次從Web服務重新下載新聞時,新聞列表中是否存在具有特定ID的新聞。這樣我每個新聞ID只有一個新聞實例。我認爲這將很難管理使用正常的NSArray - 或者我失去了一些東西?

回答

4

我必須將它們存儲在UserDefaults中以將它們保存在設備上。

UserDefaults用於存儲首選項,設置和其他「小」位信息,它們不用於存儲應用程序數據。你不必「使用」NSUserDefaults,還有很多其他選項可供你使用。例如,以原始格式或使用NSKeyedArchiver/NSKeyedUnarchiver寫入文件(在文檔目錄中)。

你可以得到這樣

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
從與新聞IDS存儲一個NSDictionary作爲鍵是罰款

除了文檔目錄路徑。我真的沒有看到有一個NSArray並將它「轉換」爲NSDictionary,使用其中一個或另一個(這樣你總是確保每個項目只有一個新聞)。

+0

我是否閱讀了Apple關於數據存儲的指導原則,似乎這些文件應該保存在'/ Library/Caches'而不是'/ Documents'中:http://developer.apple.com/icloud/documentation/數據存儲/。這是對的嗎? – dhrm

+0

如果您閱讀了自己的鏈接,則表示如果可以重新創建數據,則表示緩存;如果無法重新創建數據,則表示文檔。因爲緩存數據可以被刪除,所以如果它是關鍵的用戶數據,用戶將不會感到滿意... – jbat100

+1

就我而言,它是從我的WebService下載的新聞對象 - 就像我的數據庫的映射。這些數據可以重新下載,所以我認爲我的數據應該在'Caches'中。 – dhrm

1

NSUserDefaults不是數據庫,但您已經知道它。

無論如何,我會直接存儲陣列,並保存最後看到的新聞ID作爲單獨的偏好。然後,您只需處理ID大於上次看到的項目的新聞項目。當您下載新聞項目時,您需要更新新聞和上次看到的ID。您需要保證ID按升序排列。

根據您對新聞的具體使用情況,一種不同的方法是保存兩個數組,一個包含新聞項目,另一個包含新聞ID列表。使用第二個數組檢查是否有新消息。

除非你正在處理大量的新聞項目(在這種情況下你應該使用核心數據),你正在優化一些不需要優化的東西。讀取,排序,更新並將一個小陣列存回NSUserDefaults的速度相當快。

+0

謝謝!我認爲我需要在其他地方存儲新聞集合 - 我看到UserDefault並非爲此而生。我發現這個指南:http://mobile.tutsplus.com/tutorials/iphone/iphone-core-data/。 這是正確的路要走嗎? – dhrm

+0

如果新聞量很小(數百),並且與其他數據片段沒有關係,我建議NSKeyedArchiver,因爲jbat100在他的回答中告訴你。而且,第一次使用Core Data比第一次更容易。 – djromero

+0

你能否爲我提供一個關於如何實現NSKeyedArchiver的教程?我爲我的新聞類實現了NSCoding原型,但我需要有關如何將它們存儲在設備上的信息。 – dhrm