2011-08-07 88 views
6

我的應用程序正在從我們的Web服務中提取JSON數據。直到現在,在所有情況下,信息都會保留在內存中,或者只是隨時刷新,除了API中使用的登錄令牌之外,不需要在本地保留任何內容。隨着我們添加的新功能之一,我們將採用長度,經緯度,半徑和名稱的一組地點,最多26個地點。將對象存儲在iOS中供以後使用

我還需要在此數據中添加1-2個字段來創建更大的對象。所以我的問題是,將這種類型的數據存儲在iOS文件系統中的最佳方式是什麼?目前我一直在使用NSUserDefaults,但對於大量的數據來說,這似乎有限或不適合。也許不會。

這些數據將需要檢索,更改或編輯和重新保存。所有這些,同時仍然保留了拉動這26個物體中的任何一個的能力。提前感謝您的閱讀和幫助。

回答

5

對於數據的這種少量(26項),我建議archiving

保存到PList使用NSKeyedArchiver/NSKeyedUnarchiver。從代表的didFinishLaunchingWithOptions中讀取您的數據,並偵聽UIApplicationWillResignActiveNotification以保存它。

NSUserDefaults是設計用於存儲用戶偏好特徵的plist中。它經常被用來代替普通的plist來保存幾行代碼,我認爲這是一個糟糕的主意,因爲你會得到與你的任務無關的額外複雜性。

如果你想登錄到對人的保護竊取設備,並進行取證使用Keychain。你可能想使用包裝並閱讀一些文章,如果你有興趣評論。

如果你尋找更多的功能見Best way to store data on iphone但似乎並沒有被現在的情況。

一些代碼來讓你開始...註冊調用節省應用辭職:

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
      selector:@selector(saveMyData) 
       name:UIApplicationWillResignActiveNotification 
      object:nil]; 

在圖/字典的每個對象/不管你要存檔實現NSCoding:

- (void)encodeWithCoder:(NSCoder*)coder { 
    [coder encodeObject:myIvar forKey:kmyIvar]; 
} 

- (id)initWithCoder:(NSCoder*)coder { 
    if((self = [super initWithCoder:coder])) { 
     self.myIvar = [[coder decodeObjectForKey:kmyIvar] retain]; 
    } 
    return self; 
} 
+0

我已經看到了使用鑰匙串存儲的登錄信息,我正計劃實施的一些例子。謝謝(你的)信息。 –

+0

對於20-ISH的產品,然後CoreData來說,歸檔肯定聽起來更好。如果你需要存儲用戶名和密碼,那麼我們在這裏描述瞭如何使用Apple的示例源代碼:http://stackoverflow.com/questions/6972092/ios-how-to-store-username-password-wihtin-an -app/6972305#6972305 –

1

我有同樣的問題,只是想出了一個更好的解決方案。

你可以做的只是將JSON字符串存儲爲NSUserDefault。然後,當您重新加載應用程序時,請使用您用於第一次將JSON字符串映射到對象的相同方法(或框架實用程序)。這樣你仍然可以利用NSUserDefaults的簡易性。

如果您使用RestKit來管理您的Web服務,它變得更加容易。這篇文章的答案顯示瞭如何使用RestKit的JSON解析器從JSON映射到您的對象。

Deserializing local NSString of JSON into objects via RestKit (no network download)

+0

非常好,我會在我的項目中使用這種方法,謝謝! :-) – kernix

相關問題