CoreData fetch request to fetch CKRecord encoded with `CKRec



假设我管理的对象具有属性systemFields,其中对 CKRecord 系统字段进行了编码。

使用我从订阅通知中得到的CKRecord查询以前保存的实体的效率如何?

是否可以为NSFetchRequest设置谓词以查询现有的 CoreData 实体by CKRecord

class FailureCDEntity: NSManagedObject {
@NSManaged private (set) var summaryDescription: String
@NSManaged private (set) var creationDate: Date
@NSManaged private (set) var systemFields: Data
convenience init(record: CKRecord, in context: NSManagedObjectContext) throws {
try self.init(in: context)
systemFields = record.encode()
...
}
}

CKRecord的扩展:

extension CKRecord {
func encode() -> Data {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.requiresSecureCoding = true
encodeSystemFields(with: archiver)
archiver.finishEncoding()
return data as Data
}
}

二进制字段的谓词与其他类型的字段具有相同的限制,但二进制性质使它们更难构造。如果可以确定encode()方法将为存储的对象和通知中的对象生成完全相同的结果,则可以使用仅与systemFields的值匹配的简单谓词。如果没有,您唯一的选择取决于了解二进制编码的详细信息。你能使用"开头为"谓词吗?也许是"结尾"?如果不知道如何根据二进制表示的子集匹配值,就不可能说。

因此,依赖于二进制字段的谓词很难或不可能使用。如果你能描述如何基于二进制编码匹配值,你可能会想出一个谓词来实现它。否则,将需要其他一些技术。我对CKRecord不够熟悉,无法说出那是什么。也许存储记录 ID 并与之匹配?

最新更新