2011-09-22 79 views
6

我從JSON獲取NSDictionary(使用SBJson),並且我想存儲它。我正在使用writeToFile失敗 - 我該如何調試它爲什麼失敗(什麼工具)?

[liveData writeToFile:localFilePath atomically:YES] 

並且失敗。數據看起來像它的所有NSString,NSDictionary,和NSArray(「原子:是」的要求)。我在相同的地方使用了相同的localFilePath。

所以我的問題是:如何找出問題所在?我可以使用什麼工具來了解writeToFile失敗的原因?該日誌不顯示錯誤消息。

+0

你NSLogLog你的'localFilePath'看看是什麼值?你確定你給它一個獨一無二的名字作爲保存嗎? – msgambel

+0

我同意這個問題可能是你的路徑,你可以包含該代碼嗎? – Brodie

+1

我已經記錄了我的localFilePath,並且我還在其他地方用它來存儲其他內容(僅更改文件名 - 它是NSTemporaryDirectory()加上文件名),所以我非常確定不是這樣。但是真的是我的問題是:我該如何調試這個問題 - 我怎樣才能找出更多關於失敗的信息?在記錄器之外的xcode中是否有錯誤代碼或某種調試工具可以幫助我將其關閉?或者我只需要使用試驗和錯誤來查明它呢? –

回答

7

它可能有多種原因:

  • 你正在編寫的道路是錯誤的,不寫(你沒有寫權限),或父目錄不存在(如果localFilePath是「/path/to/file.plist」但目錄「/ path/to /」不存在,它將失敗)
  • liveData字典確實包含不屬於PropertyList對象的對象。只有NSDataNSDateNSNumberNSStringNSArray,或者NSDictionary對象可以被寫入屬性列表文件(writeToFile:atomically:寫入plist文件中,因此字典必須包含該方法成功只plist中的對象)
+1

另外值得注意的是,如果你的字典中有'NULL'值,writeToFile將會失敗。 – inorganik

+0

字典中NSNull類的任何值都將失敗。因此,在放入字典之前,請明確檢查所有值。在我的情況下,我從JSON(服務器數據)讀取值,這是這些值的一個很好的來源。 – zinnuree

1

我試過將NSDictionary保存到只有數字的鍵和值的磁盤。將密鑰切換到NSString可以工作,但不能在密鑰爲NSNumber時使用。密鑰必須是NSString?

編輯:我現在更清楚它可以是任何響應散列的對象;但通常是NSString的。

+1

是的,他們這樣做。看到我上面的答案。 – badweasel

+0

感嘆...必須將NSNumber轉換爲NSString以將數據保存到文件。謝謝你的提示。 –

4

我知道這是一個2歲的問題。但是,因爲我剛剛遇到了同樣的問題,並且在這裏修復了我發現的問題。我敢打賭你的NSDictionary有一些不是NSStrings的鍵。

相反鍵控喜歡的:喜歡

[_myDictionay setObject:thisObj forKey:[NSNumber numberWithInt:keyNumber]]; 

重點:

[_myDictionay setObject:thisObj forKey:[NSString stringWithFormat:@"%i",numberWithInt:keyNumber]]; 

這固定我的問題權利了。

頂部的方式不能保存到plist文件。

由於您從JSON轉換中獲取信息,因此可能存在某些對象或鍵是NSNumbers。你將不得不將它們轉換。但這是一個痛苦。

因此,既然你已經在json中使用它,只需將它作爲json字符串完整地存儲在@「data」鍵中,並在將plist稍後加載到數組或字典中時重新展開它。

+0

這解決了我的問題(在我的情況下,我的鍵是'NSDate's),但是它仍然沒有回答什麼工具可用於調試的問題。如果有些事情我可以在代碼中插入一些東西,例如「* NSDate不是寫入plist文件*的有效密鑰」或其他類似的東西,那就太好了。 – Olie