【问题标题】:Core Data Encoding Crash On Saving Context保存上下文时核心数据编码崩溃
【发布时间】:2020-05-11 01:03:24
【问题描述】:

保存自定义托管对象的上下文时出现以下错误:

2020-05-10 20:43:40.432001-0400 Timecard[26285:12499267] [error] error: SQLCore dispatchRequest: exception handling request: <NSSQLSaveChangesRequestContext: 0x280c206c0> ,
 -[Timecard.Day encodeWithCoder:]: unrecognized selector sent to instance 0x281a0c460 with userInfo of (null)

我使用 NSManagedObject 的自定义子类来表示“周”实体。 Week 实体充满了 Day 对象,根据错误,这似乎是问题所在:

import Foundation


public class Day: NSObject, ObservableObject, Codable {

    var name: String
    @Published var date: Date
    @Published var jobs: [Job] = []

    var totalHours: Double {
        get {
            var totalHours = 0.0
            for job in jobs {
                totalHours = totalHours + job.totalHours
            }
            return totalHours
        }
    }

    var totalDollars: Double {
        get {
            var totalDollars = 0.0
            for job in jobs {
                totalDollars = totalDollars + job.totalDollars
            }
            return totalDollars
        }
    }

    init(name: String, date: Date) {
        self.name = name
        self.date = date
    }

    init(name: String) {
        self.name = name
        self.date = Date()
    }

    func add(job: Job) {
        jobs.append(job)
    }

    // Mark: - Codable Encoding & Decoding

    enum CodingKeys: String, CodingKey {
        case date
        case jobs
        case name
    }

    required public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        date = try container.decode(Date.self, forKey: .date)
        jobs = try container.decode([Job].self, forKey: .jobs)
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(date, forKey: .date)
        try container.encode(jobs, forKey: .jobs)
    }
}

Week -> Day -> Job 都符合 Codable 并且在保存到 Plist 时可以工作。只有当我尝试保存上下文时它才会崩溃。

【问题讨论】:

    标签: swift core-data swiftui nsmanagedobject codable


    【解决方案1】:

    看起来您正在尝试将此类型用作 Core Data 可转换属性。 Core Data 可转换属性必须符合NSCodingCodable 有相似的名字和相似的用途,但它们并不相同,并且彼此不兼容。如果您想将此类型与 Core Data 可转换属性一起使用,它必须符合 NSCoding

    【讨论】:

    • 谢谢。这解决了它。我看到人们在教程中使用 Codable 和 Core Data,所以我认为它会起作用,但切换到 NSCoding 就成功了。
    【解决方案2】:

    它是is-aNSObject,你必须符合NSCoding协议

    public protocol NSCoding {
        func encode(with coder: NSCoder)
        init?(coder: NSCoder) // NS_DESIGNATED_INITIALIZER
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多