微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NSSecureCoding 与核心数据中的一致元素数组

如何解决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)
  • 使 符合 encode(with coder: NSCoder)
  • 或实现一个NSSecureUnarchiveFromDataTransformer,它需要覆盖allowedTopLevelClasses: [AnyClass]才能被调用,因此也要求对象是一个(返回Array<NSColor>.self在 Swift 中给出错误

我想防止将 NSColor 属性包装在一个类中,因为它会产生其他影响,我会认为它是臃肿的代码。我已经尝试了上面列出的两个选项中较晚的一个

难道不能使用符合 NSSecureCoding 元素的数组吗?我没有看到解决方案吗?有没有办法安全地编码/解码 [NSColor]

(我见过 this 并且我认为它不相关)

———————— 编辑—————————————————————

我现在将回答我自己的问题,但由于我不能 100% 确定这是否正确,我将在问题中这样做。

我曾尝试将其他类型(如 [Nsstring][String])与不同项目中的核心数据一起使用,这似乎完美无缺。我也尝试过使用 NSColorList 而不是 [NSColor] 但这样做我遇到了同样的问题。它甚至不适用于 NSColor。即使都说(NSColorNSColorList)都符合 NSSecureCoding(根据他们的文档),这两种类型似乎都没有正确实现这个协议。

回答我的问题:

一般来说,使用符合 NSSecureCoding 类型的数组,如 [String][Nsstring] 似乎是开箱即用的。 (属性需要是核心数据类型 Transformable 并且 Transformer 需要在 Attribute Inspector 中为给定属性设置为 NSSecureUnarchiveFromData )

就我个人而言,NSColor[NSColor]NSColorList 似乎与 NSSecureCoding 不符。 如果我错了,请纠正我!

我通过使用 [String] 而不是 [NSColor] 作为 @NSManaged 属性解决了这个问题。因此,我保存了一个十六进制表示字符串而不是对象。我使用计算变量来公开 [NSColor]

希望这在某些时候对某人有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?