初始化新 CKRecord 的正确方法
Correct Way to Initialize New CKRecord
我在 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
?
如果您已经有记录(您正在修改或删除),您将只使用该初始化程序。编码系统字段包含该信息,因此您无需直接指定。如果您要创建新记录,您将使用其他初始化程序之一来专门生成这些记录,例如 .
因此,例如在我的应用程序中,当制作与 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)
}
我在 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
?
如果您已经有记录(您正在修改或删除),您将只使用该初始化程序。编码系统字段包含该信息,因此您无需直接指定。如果您要创建新记录,您将使用其他初始化程序之一来专门生成这些记录,例如
因此,例如在我的应用程序中,当制作与 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)
}