【问题标题】:Why NSMutableDictionary don't want write to file?为什么 NSMutableDictionary 不想写入文件?
【发布时间】:2012-02-01 14:03:42
【问题描述】:
- (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 创建这个文件,它可以工作,但当我想写字典时就不行。

【问题讨论】:

  • pathString 来自哪里?
  • 我说的是 [[NSFileManager defaultManager] createFileAtPath:pathString contents:nil attributes:nil];该文件已创建...
  • 我有第一个metode init,我在那里分配它
  • 您在初始化infoDict 时似乎犯了一个错误。我的意思是对象应该是键和键-对象。

标签: iphone ios nsmutabledictionary nsfilemanager


【解决方案1】:

writeToFile:atomically 仅在您调用它的字典是有效的属性列表对象 (see docs) 时才有效。

对于NSDictionary 来说,它是一个有效的属性列表对象,除其他外,它的keys must be strings,但在您的示例中,键是NSNumber 实例。

【讨论】:

  • thx...这是个问题...但它在 2011 年运行良好...没有问题:D
  • 谢谢!我只是被所有键都必须是字符串的要求绊倒了。
【解决方案2】:

您有时无法控制要编写的内容。例如,当您要编写从服务器获取的 JSON 对象时,您无法避免 null 值。

NSData 与这些“无效”值兼容,因此在这些情况下,将NSArrayNSDictionary 转换为NSData 是一种理想的方式。

写:

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

阅读:

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

【讨论】:

  • 太棒了。如上所述,您可能并不总是能够序列化 JSON。这适用于我的 JSON。
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2020-11-04
相关资源
最近更新 更多