gpt4 book ai didi

iphone - NSUserDefaults 与 NSKeyedArchiver

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:24 25 4
gpt4 key购买 nike

我认为这是一个初学者关于数据管理的问题。

我有一个应用程序可以加载和保存不同的 txt 文件。我想给每个 txt 文件一些不保存在 txt 文件中的特征,例如名称、样式、颜色等。

到目前为止,我所做的是拥有一个 NSMutableArray *myLibrary,我将在其中保存所有这些引用。该数组如下所示:

  • 为每个 txt 文件添加一个对象到 myLibrary
  • 每个对象包含多个 NSString、NSUInteger、BOOL 和一些 NSMutableArrays
  • 在这些对象的子类中,我使用

    -(id)initWithCoder:(NSCoder *)aDecoder;-(void)encodeWithCoder:(NSCoder *)aCoder;

现在,我的大问题是保存这些数据的最佳和最安全方法。到目前为止,我一直在使用 NSKeyedArchiver,但用户报告数据丢失,并且有一个奇怪的案例,据称 iTunes 同步导致数据困惑。 NSUserDefaults 有任何保护措施吗?每次用户进行更改时,我都会保存 myLibrary.dat,所以我真的不明白为什么它不应该 100% 保存。非常感谢任何意见/建议/解释!

这是我用来编写和读取 myLibrary.Dat 的代码:

   -(NSString*)documentsDirectory
{
NSLog(@"documentsDirectory");
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
return documentsDirectory;
}

-(void)saveLibraryDat {

NSLog(@"Saving myLibrary.dat...");
NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"myLibrary.dat"];
BOOL succeed = [[NSKeyedArchiver archivedDataWithRootObject:myLibrary] writeToFile:filePath atomically:YES];
if (!succeed){ // do something }

}


-(void)loadLibraryDat {

NSLog(@"loadLibraryDat");
NSString *filePath = [[self documentsDirectory] stringByAppendingPathComponent:@"myLibrary.dat"];

self.myLibrary = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

if (self.myLibrary == nil) {
NSLog(@"myLibrary.dat empty... set up new one");
[self setupLibrary];
} else { NSLog(@"Loading myLibrary.dat successful."); }

}

编辑:我的编码器方法如下所示:

 - (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.titleName = [aDecoder decodeObjectForKey:@"titleName"];
self.fileName = [aDecoder decodeObjectForKey:@"fileName"];
self.fileFont = [aDecoder decodeObjectForKey:@"fileFont"];
self.tabTitles = [aDecoder decodeObjectForKey:@"tabTitles"];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:titleName forKey:@"titleName"];
[aCoder encodeObject:fileName forKey:@"fileName"];
[aCoder encodeObject:fileFont forKey:@"fileFont"];
[aCoder encodeObject:tabTitles forKey:@"tabTitles"];
}

@end

在 header 中,这些定义为:

NSString *titleName;
NSString *fileName;
NSString *fileFont;
NSMutableArray *tabTitles;

最佳答案

不要使用 NSUserDefaults。它更多的是默认设置,比如我应该在启动时显示窗口 X。 NSUserDefaults 不是为程序数据设计的。您应该像现在一样使用 NSKeyArchiver。该错误很可能出现在 myLibrary 包含的对象中。

你应该看看(或发布)函数:

- (id)initWithCoder:(NSCoder *)coder 
- (void)encodeWithCoder:(NSCoder *)coder

这很可能是您的问题所在。

关于iphone - NSUserDefaults 与 NSKeyedArchiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6858424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com