2012-01-03 12 views
4
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:pathString]) 
    { 
     infoDict = [[NSMutableDictionary alloc] initWithContentsOfFile:pathString]; 
    } 
    else 
    { 
     infoDict = [[NSMutableDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@"BeginFrame",@"EndFrame", nil] forKeys:[NSArray arrayWithObjects:[NSNumber numberWithBool:YES],[NSNumber numberWithBool:YES], nil]]; 
     if ([infoDict writeToFile:pathString atomically:YES]) 
     { 
      NSLog(@"Created"); 
     } 
     else 
     { 
      NSLog(@"Is not created"); 
      NSLog(@"Path %@",pathString); 
     } 
} 

これは私のコードです。私はファイルが作成されているかどうかを確認します。 - NSMutableDictionaryを作成し、パスのファイルに書き込みますが、writeToFileメソッドはNOを返します。問題はどこですか? NSFileManagerでこのファイルを作成しても動作しますが、辞書を書きたいときはありません。なぜNSMutableDictionaryはファイルに書き込みをしたくないのですか?

+0

'pathString'から来るのでしょうか? – Eimantas

+0

私は[[NSFileManager defaultManager] createFileAtPath:pathString contents:nil attributes:nil]と言っています。このファイルは作成されました... –

+0

私は最初のmetode initを持っています。私はそれを割り当てます –

答えて

28

writeToFile:atomicallyは、それを呼び出す辞書が有効なプロパティリストオブジェクト(see docs)である場合にのみ機能します。

NSDictionaryが有効なプロパティリストオブジェクトの場合は、keys must be stringsですが、この例ではNSNumberのインスタンスになります。

+0

thx ...これは問題です...しかし問題なく2011年にはうまくいきました:D –

+3

ありがとう!私はちょうどすべてのキーが文字列でなければならないという要件によって踏まれました。 –

12

時には書き込むコンテンツを制御することはできません。たとえば、サーバから取得したJSONオブジェクトを書き込む場合は、nullの値を避けることはできません。

NSDataはこれらの「無効な」値と互換性がありますので、NSArrayまたはNSDictionaryからNSDataに変換するのが理想的です。

書き込み:

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

を読む:

NSData *data = [NSData dataWithContentsOfFile:path]; 
NSDictionary *jsonObject = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+0

素晴らしい。上記のように、JSONのシリアル化は必ずしも可能ではありません。これは私のJSONでうまく動作します。 –

関連する問題