【问题标题】:NSKeyedArchiver not persisting dataNSKeyedArchiver 不持久化数据
【发布时间】:2014-08-12 23:30:04
【问题描述】:

因此,我的应用程序查询了一个 Amazon Dynamo DB 数据库并检索了几千字节的数据。我希望该应用程序做的是第一次下载所有内容,然后每次之后,只需下载时间戳以查看它是否具有最新版本的数据。所以我只需要每隔一段时间下载一次数据,我正在尝试使用 NSKeyedArchiver 来存档我正在下载的数组。我已经尝试了这三种不同的方法,但它们都不能在 iPhone 上运行,尽管其中两种可以在模拟器上运行。

[NSKeyedArchiver archiveRootObject:self.dataArray toFile:@"dataArray.archive"];

这不适用于模拟器或实际的 iphone。这种方法的结果是NO。

接下来我使用的是完整路径:

[NSKeyedArchiver archiveRootObject:self.dataArray toFile:@"Users/Corey/Desktop/.../dataArray.archive"];

这在模拟器上有效,但在 iPhone 上无效。我的猜测是,编译时,文件系统看起来不同(并且显然没有相同的路径)。所以接下来我尝试了:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"dataArray" ofType:@".archive"];

[NSKeyedArchiver archiveRootObject:self.dataArray toFile:filePath];

再一次,这在模拟器上有效,但在 iphone 上失败。在写入存档之前,我已经确认所有数据都在 self.dataArray 中,并在写回存档后确认数组为零(在 iphone 版本中)。有什么想法吗?有没有更好的方法来做文件路径?

【问题讨论】:

  • 正如@AbhiBeckert 提到的,你不能写入主包,如果你这样做了,你的应用程序将无法启动,而是尝试写入你的应用程序“文档”文件夹,该文件夹旨在保存您的应用程序所需的持久用户数据。

标签: ios cocoa-touch nskeyedarchiver nskeyedunarchiver


【解决方案1】:

这是我追踪到的:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent: @"dataArray.archive"];
[NSKeyedArchiver archiveRootObject:your_object toFile:filePath];

它在模拟器和 iPhone 上都能完美运行!

【讨论】:

    【解决方案2】:
    [NSKeyedArchiver archiveRootObject:self.dataArray toFile:@"dataArray.archive"];
    

    您必须提供完整路径。

    [NSKeyedArchiver archiveRootObject:self.dataArray toFile:@"Users/Corey/Desktop/.../dataArray.archive"];
    

    这不是完整的路径。完整路径以/ 开头,并且在任何地方都没有/../

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"dataArray" ofType:@".archive"];
    

    您没有权限在 mainBundle 中写入,它是只读的。

    另外,一般来说,您不应该使用文件路径,而应该使用 URL。一些 API(包括这个 API)需要路径,但目前推荐使用 URL。

    这是将文件写入磁盘的正确方法:

    NSURL *applicationSupportUrl = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask][0];
    
    applicationSupportUrl = [applicationSupportUrl URLByAppendingPathComponent:@"My App"]; // replace with your app name
    
    if (![applicationSupportUrl checkResourceIsReachableAndReturnError:NULL]) {
      [[NSFileManager defaultManager] createDirectoryAtURL:applicationSupportUrl withIntermediateDirectories:YES attributes:@{} error:NULL];
    }
    
    NSURL *archiveUrl = [applicationSupportUrl URLByAppendingPathComponent:@"foo.archive"];
    [NSKeyedArchiver archiveRootObject:self.dataArray toFile:archiveUrl.path];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多