从URI中检索NSManagedObjectID而不传递NSPersistentStoreCoordinator

时间:2018-06-17 08:02:03

标签: decoding codable nsmanagedobjectid

我使用数据模型来管理colectionViews中的内容。这些模型是小型独立类,仅包含UI所需的信息。要将这些模型与实际managedObjects相关联,请将NSManagedObjectID保存在那里。

现在,我实现了Drag& Drop支持,因此我需要遵守Codable协议。我在解码NSManagedObjectID时遇到了麻烦。我使用uriRepresentation()方法对其进行编码。

下面是我正在使用的示例课程。某处,我读到我可以初始化NSPersistentStoreCoordinator并使用.managedObjectID(forURIRepresentation:)来获取objectID,但它无法正常工作。对于给定的nil,它会返回URI

一种解决方案是从我的NSPersistentStoreCoordinator传递实际NSManagedObjectContext,但这有点混乱。我必须创建一个公共静态变量,以便每个人都可以访问它(我有很多数据模型)。这不是一个好的解决方案,或者是它?

有什么想法吗? 谢谢!

// I support NSItemProviderWriting and NSItemProviderReading, but that's not part of my question
final class RackModel: NSObject, ListDiffable, NSItemProviderWriting, NSItemProviderReading, Codable {

        private enum CodingKeys: String, CodingKey {
            case name
            case id
            case rackDescription
            case objectIDURL = "objectID"
        }

        // MARK: - Properties
        // ========== PROPERTIES ==========        
        public let name: String
        public let id: String
        public let rackDescription: String
        public let objectID: NSManagedObjectID
        // ====================

        // MARK: - Initializers
        // ========== INITIALIZERS ==========
        init(name: String, description: String, id: String,  objectID: NSManagedObjectID) {
            self.name = name
            self.id = id
            self.rackDescription = description
            self.objectID = objectID
        }


        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(name, forKey: .name)
            try container.encode(id, forKey: .id)
            try container.encode(rackDescription, forKey: .rackDescription)
            try container.encode(objectID.uriRepresentation(), forKey: .objectIDURL)
        }

        required init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            self.name = try values.decode(String.self, forKey: .name)
            self.id = try values.decode(String.self, forKey: .name)
            self.rackDescription = try values.decode(String.self, forKey: .name)

            let objectIDURL = try values.decode(URL.self, forKey: .objectIDURL)
            // This crashes because I'm unwrapping nil
            self.objectID = NSPersistentStoreCoordinator().managedObjectID(forURIRepresentation: objectIDURL)!
        }
...
}

0 个答案:

没有答案