2013-05-02 79 views
1

我正在使用包含所有應用程序數據的plist文件。該文件相當大,目前我在第一次啓動時將所有內容加載到數組和字典中,並將它們保存到UserDefaults中,以便我不必再次觸摸plist。由於這需要大約10秒(iP4),我不知道是否有更快(更好)的方式來處理plist。我用儀器檢查了整個啓動過程,並通過數百個條目實際上是最快的部分。將這些處理過的東西保存到NSUserDefaults中需要很長時間。最好的做法來處理大plists?

+0

你知道你幾乎沒有任何優勢重新生成plists? 'NSUserDefaults'也將信息存儲在plists中。 – 2013-05-02 19:37:30

+0

您可以在GCD隊列中完成所有工作。從一開始就創建一個普通的背景隊列,給它一個讓你的plist工作的塊。像@ H2CO3建議的那樣,把所有東西都放在NSUserDefault中,並根據需要創建方法來獲取數據。不需要把它放在兩個地方。 – John 2013-05-02 19:52:01

+0

這是因爲你有很多很多的小數據,或者你有一些巨大的NSData對象?你不應該把它們放在plist中(或者NSUserDefaults,它本身就是plist)。 – matt 2013-05-02 20:00:43

回答

0

將plist保存到自己的文件中可能會有所幫助。這樣你可以控制讀/寫,沒有任何與NSUserDefaults相關的開銷,最重要的是,可以確保格式。也就是說,如果讀/寫產生減速,那麼你必須最小化plist文件的大小。有可能使用的NSPropertyListBinaryFormat_v1_0一個的plist格式,能做到這一點:

參見:

+ (NSInteger) writePropertyList: (id) plist 
         toStream: (NSOutputStream *) stream 
         format: (NSPropertyListFormat)format 
         options: (NSPropertyListWriteOptions) opt 
          error: (NSError **) error 

從蘋果公司的財產清單編程指南:

第一種方法[使用的NSDictionary或NSArray的將writeToFile]是 簡單 - 只需要一次方法調用而不是兩次 - 但第二種方法[如上]有其優點。它允許您將 運行屬性列表轉換爲二進制格式以及XML屬性 列表。將屬性列表 的靜態表示形式轉換回對象圖形時,還可讓您更靈活地指定這些對象是可變的還是不可變的。

0

幾點。

  1. NSUserDefaults可能只是一個大plist,所以爲什麼要使用它?將條目粘貼到保存內存結構的單例中。
  2. 如果您是在第一次加載時執行此操作,因爲您希望它是可變的,請將默認值放入資源文件夾中。當你想加載它時,檢查你是否在文檔文件夾中,如果你沒有(第一次加載),將它從資源包複製到文檔。
  3. 如果您使用NSUserDefaults進行持久化,只需在applicationShouldResignActive和任何其他進行重要更改的時間將數據寫入您的plist。
  4. 寫在後臺線程,但你可能需要在這裏做一些鎖定。
  5. 當加載和保存時間變得很大時,最佳實踐可能會轉移到核心數據,但在你需要這樣做之前,1-4應該給你更多的里程。