executeQuery, не может установить inZoneWithID в ноль

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

import Foundation
import CloudKit
import UIKit


func getGetMainUser(name : String) -> CKRecord {
var myRecord : CKRecord!
let container = CKContainer.defaultContainer()
let publicDB = container.publicCloudDatabase
let predicate = NSPredicate(format: "nickName == name")
let query = CKQuery(recordType: "usersAtributes", predicate: predicate)

publicDB.performQuery(query, inZoneWithID: nil) {
    record, error in {
        if error != nil {
            println(error.localizedDescription)
        } else {
            if record.count == 1 {
                myRecord = record[0] as CKRecord
            }
        }
    }
}
return myRecord
}

Что я не понимаю, так это то, что я не могу скомпилировать этот код из-за значения nil inZoneWithID для executeQuery. Этот синтаксис может быть неправильным, хотя он работает в других частях моего кода. Это ошибка, которую я получаю:

Cannot convert the expression's type '(CKQuery!, inZoneWithID: NilLiteralConvertible, ((ST5,(ST5,ST6) -> (ST5, ST6) -> ST4) -> (ST5,(ST5,ST6)-> ST4) -> ST4,((ST5,ST6) -> (ST5,ST6)...

2 ответа

Решение

Ваша проблема не в zoneID. Документация для этого говорит это:

Идентификатор зоны для поиска. Результаты поиска ограничены записями в указанной зоне. Укажите nil для поиска зоны базы данных по умолчанию.

Это предикат, который не прав. Так должно быть:

NSPredicate (формат: "nickName = %@", имя)

И еще одна вещь, executeQuery будет выполняться асинхронно. Итак, вы возвращаете myRecord, пока он еще не установлен. У вас есть 2 варианта.

  1. Вы можете использовать семафоры, чтобы сделать этот метод синхронным.
  2. Вместо того, чтобы возвращать значение, вы можете вызвать метод при передаче блока кода. Затем вызовите этот блок кода с этой записью.

Вариант 2 является предпочтительным методом. Вариант 1 заблокирует ваше приложение во время вызова CloudKit.

Хорошо, я наконец нашел свою (новичковую) ошибку: я добавил две лишние / бесполезные скобки, которые вызывали ошибку. Открытие сразу после

record, error in

и закрытие прямо перед

return myRecord 

Теперь, когда я их удалил, все в порядке. Спасибо Эдвин, твой полезный ответ мне очень поможет теперь, когда код компилируется.

Другие вопросы по тегам