我使用数据模型来管理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)!
}
...
}