假设我有一个带有属性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
}
}发布于 2018-04-24 00:26:45
二进制字段的谓词与其他类型的字段具有相同的限制,但二进制的性质使它们更难构造。如果您可以确保您的encode()方法将为存储的对象和通知中的对象生成完全相同的结果,那么您可以使用一个简单的谓词来匹配systemFields的值。如果不是,您唯一的选择取决于是否了解二进制编码的细节。你能使用“start with”谓词吗?也许是“以”结尾?如果不知道如何根据二进制表示的子集来匹配值,这是不可能的。
因此,依赖于二进制域的谓词很难或不可能使用。如果您能够描述如何基于二进制编码匹配值,那么您可能会想出一个谓词来实现这一点。否则,将需要其他一些技术。我对CKRecord还不够熟悉,无法说出那是什么。也许可以存储记录ID并与之匹配?
https://stackoverflow.com/questions/49985474
复制相似问题