【发布时间】:2020-12-24 05:54:10
【问题描述】:
只是一点背景信息。几年前我失去了说话的能力,并学会了如何专门编写代码来为自己制作一个好的文本到语音应用程序。令人惊讶的是,许多其他人发现它很有用。苹果每周报告大约 15,000 次会话。顺便说一句,它是免费的。
在我开始学习的时候,目标 C 是当前的语言,所以这就是我学到的。我现在正在学习 Swift,但我还没有准备好重新编写我的应用程序。我只是还不够了解。
我正在尝试更新应用程序,但 NSKeyedArchiver 有一个已弃用的方法,我一直在尝试修复它。以下是显示代码的代码 sn-p。这在用户关闭应用程序时运行并且应该保存他们的数据:
...
persistence.field19 = [NSNumber numberWithBool:self.autoOn];
persistence.field20 = [NSNumber numberWithBool:self.instructionShown];
NSMutableData *data = [[NSMutableData alloc] init];
//NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:false];
[archiver encodeObject:persistence
forKey:kDataKey];
[archiver finishEncoding];
[data writeToFile:[self dataFilePath]
atomically:YES];
}
我有“initForWritingWithMutableData:data”这一行,并被告知用“initRequiringSecureCoding:Bool”替换。这很高兴 Xcode 删除了警告,但不再保存用户设置和数据。我相信这是因为我曾经将 NSMutableData 分配给存档器,但现在不再这样做了。我在文档中发现以下可能会有所帮助,但我不知道如何实现:
(NSData *)archivedDataWithRootObject:(id)object
requiringSecureCoding:(BOOL)requiresSecureCoding
error:(NSError * _Nullable *)error;
当应用再次启动时,我会加载他们的设置并使用以下内容保存数据:
// Restore settings
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:NULL];
//initForReadingWithData:data];
“initForReadingWithData:data”也被弃用了,我被告知使用“initForReadingFromData:error:”方法代替它。我“认为”这很好。
非常感谢任何帮助或建议。
更新:感谢 TheNextman 的建议,存档器正在工作。这是当前代码:
...
persistence.field20 = [NSNumber numberWithBool:self.instructionShown];
// NSMutableData *data = [[NSMutableData alloc] init];
// NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:false];
[archiver encodeObject:persistence forKey:kDataKey];
[archiver finishEncoding];
NSData* data = [archiver encodedData];
[data writeToFile:[self dataFilePath] atomically:YES];
// [archiver encodeObject:persistence
// forKey:kDataKey];
// [archiver finishEncoding];
// [data writeToFile:[self dataFilePath]
// atomically:YES];
}
但要使其正常工作,我必须继续使用已弃用的未归档代码。
// Restore settings
NSString *filePath = [self dataFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
// NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:NULL];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
“initForReadingWithData:data”再次被弃用,我被告知使用“initForReadingFromData:error:”如果我使用新代码,它可以编译并运行良好,但用户数据不会重新出现。
【问题讨论】:
标签: ios objective-c xcode nskeyedarchiver nskeyedunarchiver