2013-12-23 58 views
3

我想用下面的方法來保存NSDictionary是否有保存的NSDictionary任何限制到文件

+ (void)writeDicToFile:(NSDictionary *)dic fileName:(NSString *)fileName 
{ 
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName]; 
[dic writeToFile:filePath atomically:YES]; 
} 

但對於一些字典它的工作原理,並對於一些複雜的字典這是行不通的。

幫幫我!

+1

字典中的對象必須符合[協議](https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Protocols/NSCoding_Protocol/Reference/Reference.html),所以它們可以(德)序列化 –

+0

謝謝!我知道現在的錯誤在哪裏。 – bohan

+0

我正在尋找如何實現這一點。 – bohan

回答

2

爲了使NSDictionary成功保存,它保存的所有對象必須符合NSCoding protocol

總之這意味着你必須實現

- (void)encodeWithCoder:(NSCoder *)encoder 

- (id)initWithCoder:(NSCoder *)decoder 

你所有的自定義類。

一個很好的教程是在這裏:http://www.raywenderlich.com/1914/nscoding-tutorial-for-ios-how-to-save-your-app-data

編輯:

一旦你寫你NSCoder方法,你可以保存這樣的數據:

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:self]; 
[archiver finishEncoding]; 
[data writeToFile:file atomically:YES]; 

和init從文件的對象像這樣:

NSData *data = [[NSData alloc] initWithContentsOfFile:file]; 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
self = [unarchiver decodeObject]; 
[unarchiver finishDecoding]; 

您確實提到了json對象的問題:有關json對象的事情是,首先您必須檢查它的類型:它可以是NSDictionaryNSArray - 取決於輸入和格式。

當你只有一個元素的數組 - 你正在尋找的字典時遇到常見問題。如果您的字典{...} json表示被嵌入[]內,就會發生這種情況。

+0

中加入''它仍然不起作用。我已經實現了encodeWithCoder:和initWithCoder:方法。幫幫我! – bohan

+0

NSData * data = [NSKeyedArchiver archivedDataWithRootObject:jsonObject]; [data writeToFile:atomically:YES]; – bohan

+0

你可以多發表一下你如何生成這個jsonObject?使用json解析器時,如果結果將會是dicitonary或數組,則通常不會提前知道「問題」。並請發佈您的兩種方法的實施。 –

0

文檔說:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag 

這種方法遞歸地驗證了所有包含的對象是前 屬性列表對象(NSData的,NSDate的,的NSNumber, 的NSString,NSArray的,或NSDictionary中的實例)寫出文件,並且 如果所有對象都不是屬性列表對象,則返回NO,因爲 生成的文件不是有效的屬性列表。

你在你的字典中推出了什麼對象?
把你的字典中的屬性列表對象,然後沒有理由,它不起作用。

您還應該看到該方法的返回值。 ( 是或否)。

相關問題