首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSKeyedArchiver不推荐方法问题

NSKeyedArchiver不推荐方法问题
EN

Stack Overflow用户
提问于 2020-09-05 02:44:06
回答 1查看 861关注 0票数 2

只是一些背景信息。几年前,我失去了说话的能力,学会了如何为自己编写一个好的文本到语音应用程序。令人惊讶的是,许多其他人认为它很有用。苹果每周报告约15,000次会议。这是免费的。

在我开始学习的时候,目标C就是现在的语言,所以这就是我学到的。我现在正在学习Swift,但我还没有准备好重新编写我的应用程序。我只是还不知道。

我试图更新应用程序,但NSKeyedArchiver有一个不推荐的方法,我被困在试图修复它。下面是显示代码的代码片段。当用户关闭应用程序并保存他们的数据时,这会运行:

代码语言:javascript
运行
复制
   ...        
    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分配给归档程序,但现在不再这样做了。在文档中,我发现以下可能会有所帮助,但我不知道如何实现:

代码语言:javascript
运行
复制
(NSData *)archivedDataWithRootObject:(id)object 
                 requiringSecureCoding:(BOOL)requiresSecureCoding 
                                 error:(NSError * _Nullable *)error;

当应用程序再次启动时,我会加载它们的设置并保存数据,如下所示:

代码语言:javascript
运行
复制
// 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的建议,归档程序才能正常工作。这是当前的代码:

代码语言:javascript
运行
复制
    ...
    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];
}

但是,要使这一工作有效,我必须继续使用已弃用的未存档代码。

代码语言:javascript
运行
复制
    // 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:”如果我使用新代码,它编译并运行良好,但用户数据不会再次出现。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63749969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档