You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CoreData保存数据时触发NSSecureUnarchiveFromDataTransformer编码错误如何解决?

问题修复方案

核心错误点

  • 你向CoreData的questions属性赋值的是[QuestionList]类型数组,但你配置的Transformer仅支持QuestionsNSSecureCoding类型,且没有做类型转换,这是报错的核心原因
  • Transformer允许的顶级类没有包含数组类型,无法识别你存储的数组结构
  • encode方法中imageData没有指定编码key,解码时无法匹配对应值
  • 若未在CoreData模型中正确配置Transformable属性的Transformer名称,也会触发编码异常

修复步骤

1. 修正存储时的类型转换

修改保存方法,将QuestionList数组转换为符合NSSecureCoding的QuestionsNSSecureCoding数组再赋值:

func saveSelectedQuestion(questionTitle: String, id: String, questions: [QuestionList]) {
    let questionsCD = QuestionCD(context: persistentContainer.viewContext)
    questionsCD.title = questionTitle
    questionsCD.id = id
    // 新增类型转换逻辑
    let secureQuestions = questions.map { item in
        QuestionsNSSecureCoding(
            id: item.id,
            question: item.question,
            isQuestionImage: item.isQuestionImage,
            isSectionImage: item.isSectionImage,
            imageURL: item.imageURL,
            imageData: item.imageData,
            sections: item.sections,
            selected: item.selected,
            correct: item.correct
        )
    }
    questionsCD.questions = secureQuestions
    
    do {
        try persistentContainer.viewContext.save()
    } catch {
        print("Failed to save selected category: \(error.localizedDescription)")
    }
}

2. 补充Transformer允许的类

你存储的是数组结构,需要在允许的顶级类中加入NSArray,同时补充字典、字符串等基础类型避免解码异常:

override static var allowedTopLevelClasses: [AnyClass] {
    return [NSArray.self, QuestionsNSSecureCoding.self, NSString.self, NSDictionary.self, NSData.self]
}

3. 修正NSSecureCoding编码逻辑

给imageData加上编码key:

func encode(with coder: NSCoder) {
    coder.encode(id, forKey: "id")
    coder.encode(question, forKey: "question")
    coder.encode(isQuestionImage, forKey: "isQuestionImage")
    coder.encode(isSectionImage, forKey: "isSectionImage")
    coder.encode(imageURL, forKey: "imageURL")
    // 修正这里,添加forKey
    coder.encode(imageData, forKey: "imageData")
    coder.encode(sections, forKey: "sections")
    coder.encode(selected, forKey: "selected")
    coder.encode(correct, forKey: "correct")
}

4. 检查CoreData模型配置

打开你的QuestionsCoreData模型文件,找到QuestionCD实体的questions属性:

  • 类型选择Transformable
  • Transformer栏填写QuestionsValueTransformer
  • Custom Class栏填写NSArray

内容的提问来源于stack exchange,提问作者Ufuk Köşker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:27:04