Objective-C:如何让它为 NSCoding 保存两个文件而不是一个文件?
Posted
技术标签:
【中文标题】Objective-C:如何让它为 NSCoding 保存两个文件而不是一个文件?【英文标题】:Objective-C: How to make it save two files instead of one for NSCoding? 【发布时间】:2011-12-13 23:45:05 【问题描述】:我的代码在这里:
-(void)loadDataFromDisk
[dict release];
NSMutableData* data = [NSMutableData dataWithContentsOfFile:[self pathForDataFile]];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
dict = [[unarchiver decodeObjectForKey:fileKey] retain];
[unarchiver finishDecoding];
[unarchiver release];
if(dict == NULL)
NSLog(@"First time in.");
dict = [[NSMutableDictionary alloc] init];
-(void)saveDataToDisk
NSMutableData* data = [NSMutableData data];
NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver setOutputFormat:NSPropertyListBinaryFormat_v1_0];
// EncodeObject will automatically encode every primitive inside 'dictionaryToSave',
// As for objects, the object class must conform to NSCoding Protocol, else an error will occur.
[archiver encodeObject:dict forKey:fileKey];
[archiver finishEncoding];
[archiver release];
[data writeToFile:[self pathForDataFile] atomically:YES];
-(NSString*)pathForDataFile
NSArray* documentDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString* path = nil;
if (documentDir)
path = [documentDir objectAtIndex:0];
else
NSLog(@"error in [PersistentHandler pathForDataFile]");
// Returns 'directory'/data.bin to method(saveDatatoDisk/loadDataFromDisk)
return [NSString stringWithFormat:@"%@/%@", path, @"data.bin"];
如果我使用指定的 fileKey(即:“buttons”)保存一个文件一次,它会起作用。但是如果我想使用指定的 fileKey(即:“clocks”)将另一个文件保存到磁盘,它会覆盖“按钮”与“时钟”,因此“按钮无法再次访问..
如何解决这个困境?我相信这应该是我“保存DataToDisk”(存档)的方式,我应该将一堆文件写入磁盘,而不是用最新的文件替换每个文件。
【问题讨论】:
【参考方案1】:除非我读错了你的代码,否则你总是使用相同的路径来保存文件。这就是它被覆盖的原因。
return [NSString stringWithFormat:@"%@/%@", path, @"data.bin"];
每次保存文件都在/path/you/retrieve/data.bin
您需要更改文件名或保存它的目录。如果您想保持相同的文件名,则每次保存时都创建一个新目录,并在该目录上加上时间戳或描述你正在保存什么。
【讨论】:
【参考方案2】:你总是写到“~/Documents/data.bin”——你的pathForDataFile
方法总是返回那个路径。如果你想保存到不同的文件,你应该写入不同的文件。
【讨论】:
以上是关于Objective-C:如何让它为 NSCoding 保存两个文件而不是一个文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 REST kit for Objective-C 请求嵌套资源
如何在 Objective-C 中编写 lambda 方法?