Как получить несколько типов из CloudKit, используя CKRecord.ID? - PullRequest
0 голосов
/ 30 апреля 2020

При извлечении нескольких типов из CloudKit с использованием CKRecord.ID я получаю следующую ошибку:

Ошибка

Cannot invoke 'map' with an argument list of type '(@escaping (CKRecord.ID, String, CKAsset, Int) -> Lib)'

Функция CloudKit Fetch

static func fetch(_ recordID: [CKRecord.ID], completion: @escaping (Result<[Lib], Error>) -> ()) {
    let recordID: [CKRecord.ID] = recordID
    let operation = CKFetchRecordsOperation(recordIDs: recordID)
    operation.qualityOfService = .utility

    operation.fetchRecordsCompletionBlock = { (record, err) in
        guard let record = record?.values.map(Lib.init) ?? [] //returns error here
        else {
            if let err = err {
                completion(.failure(err))
            }
            return
        }

        DispatchQueue.main.async {
            completion(.success(record))
        }
    }

    CKContainer.default().publicCloudDatabase.add(operation)
}

Lib

struct Lib {
    var recordID: CKRecord.ID
    var name: String
    var asset: CKAsset
    var rating: Int
}

Как получить несколько типов из CloudKit, используя CKRecord.ID?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы не определили инициализатор, который принимает CKRecord.

. Это заставит его скомпилироваться:

extension Lib {
  init(_: CKRecord) { fatalError() }
}

Избавьтесь от ?? [] и go от Там!

Это может помочь вам, если вы используете точное множественное число:

operation.fetchRecordsCompletionBlock = { records, error in
  guard let libs = records?.values.map(Lib.init)
0 голосов
/ 02 мая 2020

Ответ от @Jessey был очень полезным, но продолжал возвращать fatalError(). В итоге получилось добавить к init.

Lib

struct Lib {
    var recordID: CKRecord.ID
    var name: String
    var asset: CKAsset
    var rating: Int

    init(record: CKRecord){
        recordID = record.recordID
        name = (record["name"] as? String)!
        asset = (record["asset"] as? CKAsset)!
        rating = (record["rating"] as? Int)!
    }
}

«Имя», «актив» и «рейтинг» являются пользовательскими имена полей в записях панели инструментов CloudKit. Я также избавился от ?? [] в функции fetch согласно инструкции.

Обучающее руководство по CloudKit: Начало работы было хорошим справочным материалом.

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