CloudKit - CKRecord.ID приемлемая записьName? - PullRequest
0 голосов
/ 28 февраля 2019

Я написал метод для сохранения записей в пользовательской зоне, и он, кажется, работает как положено.Однако в одном я не уверен, что это CKRecord.ID recordName.Прямо сейчас я просто использую строку UUID.Есть ли предпочтительный способ присвоения recordName?Текущие примеры CloudKit довольно скудны, и кажется, что приличная часть документации CK устарела.Спасибо.

func saveToCloud(record: String, recordType: String, recordTypeField: String, reference: CKRecord?, referenceType: String?) {

    let zoneID = CKRecordZone.ID(zoneName: Zone.test, ownerName: CKRecordZone.ID.default.ownerName)
    let recordID = CKRecord.ID(recordName: UUID().uuidString, zoneID: zoneID)
    let newRecord = CKRecord(recordType: recordType, recordID: recordID)

    if let reference = reference, let referenceType = referenceType {
        let newReference = CKRecord.Reference(record: reference, action: .none)
        newRecord[referenceType] = newReference
    }
    newRecord[recordTypeField] = record
    database.save(newRecord) { (_,error) in
        if let err = error as? CKError {
            print("ERROR =" , err.userInfo )
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

По моему опыту, лучше всего генерировать имя записи из ключа записи, то есть из комбинации полей, которые должны быть уникальными.

Таким образом, вы можете гарантировать уникальность, даже если вы по ошибке попытаетесь добавитьодна и та же запись дважды.

AFAIK, другого способа сделать определенные комбинации полей уникальными в CloudKit нет.

0 голосов
/ 20 августа 2019

Я согласен, что UUID идеален.Пример:

let newId = CKRecord.ID(recordName: UUID().uuidString)

Однако важно не пытаться создать его с недопустимыми символами или строкой нулевой длины.Результат фатальная ошибка !Таким образом, при загрузке их из ненадежного источника (например, при разборе с сервера) я использую функцию безопасности следующим образом:

extension CKRecord.ID {     
    public static func fromUntrusted(_ string: String?) -> CKRecord.ID? {
        guard let string = string else { return nil }
        guard let _ = string.data(using: .ascii, allowLossyConversion: false) else { return nil }
        guard string.count > 0 && string.count < 255 else { return nil }
        return CKRecord.ID(recordName: string)
    }
}

использование:

if let recordId = CKRecord.ID.fromUntrusted(response) {
    // use value
}
0 голосов
/ 28 февраля 2019

С моей точки зрения это очень ясно видно в документах CKRecord.ID:

Объект идентификатора записи состоит из строки имени и идентификатора зоны.Строка имени представляет собой строку ASCII длиной не более 255 символов.Для автоматически создаваемых записей строка имени идентификатора основана на UUID и поэтому гарантированно будет уникальной.Создавая свои собственные объекты идентификаторов записей, вы можете использовать имена, которые имеют большее значение для вашего приложения или для пользователя, если каждое имя уникально в указанной зоне.Например, вы можете использовать имя документа для строки имени.

...