Правильный способ инициализации нового CKRecord - PullRequest
0 голосов
/ 27 июня 2018

Я использую Realm для локального кэша в приложении Mac и 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()

Но если я инициализирую CKRecord с coder, как я могу указать свои recordID и zoneID?

1 Ответ

0 голосов
/ 27 июня 2018

Вы будете использовать этот инициализатор, только если у вас уже есть запись (вы изменяете или удаляете). Закодированные системные поля содержат эту информацию, поэтому вам не нужно указывать ее напрямую. Если вы создаете новую запись, вы будете использовать один из других инициализаторов для ее генерации, например, , например, .

Так, например, в моем приложении, когда я делаю запись для синхронизации с 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)

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...