#swift #icloud #ckquery
#swift #icloud #ckquery
Вопрос:
Я написал эту модель swift file class и запускается при вызовах без ошибок, но не заполняет данные поля записи в массив resultsValueArray. Чего мне здесь не хватает?
import Foundation
import CloudKit
class TeamDataLoad {
let container = CloudKit.CKContainer(identifier: "ICloud.Brian-Naszradi.RosterTableView")
func rosterQuery(tName: String) -> Array<Any> {
var resultsValueArray = [] as Array
let teamPredicate = NSPredicate(format: "teamName == %@", tName)
print("teamPredicate: ", teamPredicate)
let query = CKQuery(recordType: "team", predicate: teamPredicate)
print("query: ", query)
let qOperation = CKQueryOperation.init(query: query)
qOperation.resultsLimit = 25
qOperation.recordFetchedBlock = { record in
let results = [record.value(forKey: "player") as! String]
print("player is:", results)
resultsValueArray.append(contentsOf: results)
} //recordFetchedBlock
qOperation.queryCompletionBlock = { cursor, error in
let queryCount = resultsValueArray.count
} // qOperttion queryCompletionBlock
CKContainer.default().publicCloudDatabase.add(qOperation)
return resultsValueArray
} //rosterQuery func
} // TeamDataLoad class
Есть предложения?
Комментарии:
1. Где вы используете парня с именем container и откуда берется publicCloudDatabase?
2. Контейнер используется CKQuery, CKQueryOperation и т. Д. И Выполняется с помощью инструкции CKContainer.default().publicCloudDatabase.add(qOperation). Код успешно запрашивает базу данных iCloud, но я не могу понять, почему он не заполняет resultsValueArray?
3. Это потому
CKQueryOperation
, что работает асинхронно? Используйте блок завершения, чтобы дождаться результата.4. Спасибо, что указали мне правильное направление. Операция ckqueryоперация является асинхронной. Пытался использовать блок завершения, но возврат класса все равно произошел до выполнения блока завершения. Я добавил счетчик непосредственно перед инструкцией class return, чтобы дождаться завершения операции запроса, и resultsValueArray действительно был заполнен и успешно передан при вызове метода. Интересно, есть ли лучший способ сделать это, кроме как с помощью счетчика, угадывающего, когда операция запроса завершается?