CoreData获取请求以获取使用`CKRecord.encodeSystemFields`编码的CKRecord

时间:2018-04-23 16:07:44

标签: core-data cloudkit

假设我有一个带有属性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
   }
}

1 个答案:

答案 0 :(得分:0)

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

由于这个原因,依赖于二进制字段的谓词很难或不可能使用。如果您可以描述如何根据二进制编码匹配值,您可能会想出一个谓词来实现它。否则,将需要一些其他技术。我对systemFields不够熟悉,不知道那是什么。也许存储记录ID并匹配?