只是一些背景信息。几年前,我失去了说话的能力,学会了如何为自己编写一个好的文本到语音应用程序。令人惊讶的是,许多其他人认为它很有用。苹果每周报告约15,000次会议。这是免费的。
在我开始学习的时候,目标C就是现在的语言,所以这就是我学到的。我现在正在学习Swift,但我还没有准备好重新编写我的应用程序。我只是还不知道。
我试图更新应用程序,但NSKeyedArchiver有一个不推荐的方法,我被困在试图修复它。下面是显示代码的代码片段。当用户关闭应用程序并保存他们的数据时,这会运行:
...
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:”如果我使用新代码,它编译并运行良好,但用户数据不会再次出现。
https://stackoverflow.com/questions/63749969
复制相似问题