如何解决NSSecureCoding 与核心数据中的一致元素数组
我有一个符合 NSManagedobject
的类,具有三个 @NSManaged
属性:
它们具有以下类型 Core Data Type : Swift Type
:
String : String
Boolean : Bool
Transformable : [NSColor]
使用以下类:
public class MyClass: NSManagedobject {
@NSManaged private(set) var text: String
@NSManaged private(set) var myBool: Bool
@NSManaged private(set) var colors: [NSColor]
// ... other code ...
}
目前我收到以下警告:
CoreData:此应用程序中的一个或多个模型正在使用 具有未设置转换器名称的可转换属性, 或设置为 NSKeyedUnarchiveFromDataTransformerName。请切换到 使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 代替。在某些时候,核心数据 当 nil 是时,将默认使用“NSSecureUnarchiveFromData” 指定的和可转换的属性包含不 支持 NSSecureCoding 会变得不可读。
func fetchPalettes() -> [MyClass] {
let fetchRequest = NSFetchRequest<MyClass>.init(entityName: "MyClass")
let result = try? self.moc.fetch(fetchRequest) // <<-------
return result ?? []
}
显然这个问题不是新问题,我查看了一些资源,例如 these two。
但据我了解我偶然发现的所有资源,如果属性想要安全地符合 Core Data Transformable
类型,则需要一个类。
如果我理解正确,可以做两件事:
- 通过在
NSSecureCoding
初始化期间调用decodeObject(of: Class,for: Key)
并实现init?(coder: NSCoder)
使 类 符合 - 或实现一个
NSSecureUnarchiveFromDataTransformer
,它需要覆盖allowedTopLevelClasses: [AnyClass]
才能被调用,因此也要求对象是一个类(返回Array<NSColor>.self
在 Swift 中给出错误)
encode(with coder: NSCoder)
我想防止将 NSColor
属性包装在一个类中,因为它会产生其他影响,我会认为它是臃肿的代码。我已经尝试了上面列出的两个选项中较晚的一个。
难道不能使用符合 NSSecureCoding
元素的数组吗?我没有看到解决方案吗?有没有办法安全地编码/解码 [NSColor]
?
(我见过 this 并且我认为它不相关)
———————— 编辑—————————————————————
我现在将回答我自己的问题,但由于我不能 100% 确定这是否正确,我将在问题中这样做。
我曾尝试将其他类型(如 [Nsstring]
和 [String]
)与不同项目中的核心数据一起使用,这似乎完美无缺。我也尝试过使用 NSColorList
而不是 [NSColor]
但这样做我遇到了同样的问题。它甚至不适用于 NSColor
。即使都说(NSColor
和 NSColorList
)都符合 NSSecureCoding
(根据他们的文档),这两种类型似乎都没有正确实现这个协议。
回答我的问题:
一般来说,使用符合 NSSecureCoding
类型的数组,如 [String]
或 [Nsstring]
似乎是开箱即用的。 (属性需要是核心数据类型 Transformable
并且 Transformer 需要在 Attribute Inspector 中为给定属性设置为 NSSecureUnarchiveFromData
)
就我个人而言,NSColor
、[NSColor]
或 NSColorList
似乎与 NSSecureCoding
不符。 如果我错了,请纠正我!
我通过使用 [String]
而不是 [NSColor]
作为 @NSManaged
属性解决了这个问题。因此,我保存了一个十六进制表示字符串而不是对象。我使用计算变量来公开 [NSColor]
。
希望这在某些时候对某人有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。