我将Realm用于Mac应用程序中的本地缓存,并将CloudKit用于同步。到目前为止,我一直在初始化CKRecord
这样的对象:
let record = CKRecord(recordType: "Workspace", recordID: CKRecordID(recordName: workspace.recordName, zoneID: "..."))
对象workspace
是我本地缓存的对象,它的recordName
与CKRecord
的{{1}}相匹配。
我最近了解了recordName
,并且需要将记录的元数据存储在本地缓存中。但是据我所知,用该元数据初始化对象的唯一方法是这样的:
encodeSystemFields
但是如果我用let coder = NSKeyedUnarchiver(forReadingWith: object.recordData!)
coder.requiresSecureCoding = true
let record = CKRecord(coder: coder)
coder.finishDecoding()
初始化CKRecord
,如何指定coder
和recordID
?
答案 0 :(得分:1)
仅当您已经有记录(正在修改或删除)时,才将使用该初始化程序。编码的系统字段包含该信息,因此您无需直接指定。如果要创建新记录,则将使用其他初始化程序之一来专门生成这些记录,例如like so。
例如,在我的应用中,制作记录以与iCloud同步时,我只检查元数据是否存在,如果存在,我就使用CKRecord(coder :),否则使用CKRecord(recordType:recordID :),如下所示:
if let ckMetaData = object.value(forKey: Schema.GenericFieldNames.ckMetaData) as? Data {
// MetaData exists
if self.debug {
print(" RecordFromObject \(self.objectName) We have Metadata. This will update an existing record in iCloud")
}
let unarchiver = NSKeyedUnarchiver(forReadingWith: ckMetaData)
unarchiver.requiresSecureCoding = true
self.outputRecord = CKRecord(coder: unarchiver)
} else {
// No MetaData
if self.debug {
print(" RecordFromObject \(self.objectName) We have no Metadata. This record will be new to iCloud!")
}
let objectID = object.objectID.uriRepresentation().absoluteString
let recordID = CKRecordID(recordName: objectID, zoneID: self.inputRecordZoneID)
self.outputRecord = CKRecord(recordType: object.entity.managedObjectClassName, recordID: recordID)
}