初始化新CKRecord的正确方法

时间:2018-06-26 21:21:20

标签: cloudkit

我将Realm用于Mac应用程序中的本地缓存,并将CloudKit用于同步。到目前为止,我一直在初始化CKRecord这样的对象:

let record = CKRecord(recordType: "Workspace", recordID: CKRecordID(recordName: workspace.recordName, zoneID: "..."))

对象workspace是我本地缓存的对象,它的recordNameCKRecord的{​​{1}}相匹配。

我最近了解了recordName,并且需要将记录的元数据存储在本地缓存中。但是据我所知,用该元数据初始化对象的唯一方法是这样的:

encodeSystemFields

但是如果我用let coder = NSKeyedUnarchiver(forReadingWith: object.recordData!) coder.requiresSecureCoding = true let record = CKRecord(coder: coder) coder.finishDecoding() 初始化CKRecord,如何指定coderrecordID

1 个答案:

答案 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)

        }