因此,我的应用程序查询Amazon Dynamo数据库数据库并检索数千字节的数据。我想要的应用程序是第一次下载所有内容,然后每次下载,只需下载一个时间戳,看看它是否有最新版本的数据。所以我只需要每隔一段时间下载一次数据,我正在尝试使用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中,并确认在写回存档后该数组为nil(在iphone版本中)。有什么想法发生了什么?有没有更好的方法来执行文件路径?
答案 0 :(得分: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上都运行良好!
答案 1 :(得分:0)
[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(包括这一个)需要一个路径,但目前推荐使用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];