首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化新CKRecord的正确方法

初始化新CKRecord的正确方法
EN

Stack Overflow用户
提问于 2018-06-26 21:21:19
回答 1查看 622关注 0票数 1

我在Mac应用程序中使用领域作为本地缓存,而CloudKit用于同步。到目前为止,我一直在像这样初始化CKRecord对象:

代码语言:javascript
复制
let record = CKRecord(recordType: "Workspace", recordID: CKRecordID(recordName: workspace.recordName, zoneID: "..."))

对象workspace是本地缓存的对象,它的recordNameCKRecordrecordName匹配。

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

代码语言:javascript
复制
let coder = NSKeyedUnarchiver(forReadingWith: object.recordData!)
coder.requiresSecureCoding = true
let record = CKRecord(coder: coder)
coder.finishDecoding()

但是,如果使用CKRecord初始化coder,如何指定recordIDzoneID

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 13:49:29

只有当您已经有了记录(您正在修改或删除)时,您才会使用该初始化器。编码的系统字段包含该信息,因此不需要直接指定该信息。如果您正在创建一个新记录,您将使用其他初始化器之一专门生成这些记录,例如like so

例如,在我的应用程序中,当创建与iCloud同步的记录时,我只检查元数据是否存在,如果有元数据,我使用CKRecord(编码器:),否则使用CKRecord(recordType: recordID:),如下所示:

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51051522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档