【问题标题】:Correct Way to Initialize New CKRecord初始化新CKRecord的正确方法
【发布时间】:2018-12-05 16:26:10
【问题描述】:

我在 Mac 应用程序中使用 Realm 作为本地缓存,并使用 CloudKit 进行同步。到目前为止,我一直在初始化 CKRecord 对象,如下所示:

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

对象workspace 是我本地缓存的对象,它的recordName 匹配CKRecord 的recordName。

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

let coder = NSKeyedUnarchiver(forReadingWith: object.recordData!)
coder.requiresSecureCoding = true
let record = CKRecord(coder: coder)
coder.finishDecoding()

但如果我用coder 初始化我的CKRecord,我如何指定我的recordID 和zoneID?

【问题讨论】:

  • 克利夫顿,又是你。当我看到 coder 这个词和关键字 NSKeyedUnarchiver;我想到了 Swift 4.0 中新的 Codable 协议。也许完全不相关,但是……你看看?

标签: cloudkit


【解决方案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)
}

【讨论】:

  • 好的,完美。这就是我要做的。感谢您的帮助!
猜你喜欢
  • 2019-10-24
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2021-10-27
  • 2011-08-20
  • 2015-05-23
相关资源
最近更新 更多