代码之家  ›  专栏  ›  技术社区  ›  Clifton Labrum

初始化新的ckrecord的正确方法

  •  1
  • Clifton Labrum  · 技术社区  · 7 年前

    我在Mac应用程序中使用realm作为本地缓存,使用cloudkit进行同步。到目前为止,我一直在初始化 CKRecord 这样的对象:

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

    对象 workspace 是本地缓存的对象及其 recordName 匹配 CKR记录 记录名 .

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

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

    但如果我初始化 CKR记录 具有 coder ,如何指定 recordID zoneID 是吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Brian M    7 年前

    只有当你已经有一个记录(你正在修改或删除)时,你才会使用初始值设定项。编码的系统字段包含该信息,因此不需要直接指定。例如,如果您正在创建一个新记录,您将使用其他初始值设定项之一专门生成这些记录。 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)
    
            }