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 варианта.
- Вы можете использовать семафоры, чтобы сделать этот метод синхронным.
- Вместо того, чтобы возвращать значение, вы можете вызвать метод при передаче блока кода. Затем вызовите этот блок кода с этой записью.
Вариант 2 является предпочтительным методом. Вариант 1 заблокирует ваше приложение во время вызова CloudKit.
Хорошо, я наконец нашел свою (новичковую) ошибку: я добавил две лишние / бесполезные скобки, которые вызывали ошибку. Открытие сразу после
record, error in
и закрытие прямо перед
return myRecord
Теперь, когда я их удалил, все в порядке. Спасибо Эдвин, твой полезный ответ мне очень поможет теперь, когда код компилируется.