プロジェクトでCloudKitを使用していて、クラウドのデータをロードしてユーザーが既にクラウドにいるかどうかを確認していますが、loadUser()
関数を呼び出すと、実際の値より前の値が表示されます。ここでは、コードは次のとおりです。関数が値を返すのが速すぎる
override func viewDidLoad() {
super.viewDidLoad()
var shouldSaveUser = Bool()
shouldSaveUser = loadUser()
if shouldSaveUser == true {
send2Cloud()
} else {
print("\nUSER ALREADY IN THE CLOUD\n")
}
}
func loadUser() -> Bool {
users = [CKRecord]()
let publicData = CKContainer.defaultContainer().publicCloudDatabase
let predicate = NSPredicate(format: "id == %@", id)
let query = CKQuery(recordType: "User", predicate: predicate)
publicData.performQuery(query, inZoneWithID: nil) { (results: [CKRecord]?, error: NSError?) -> Void in
publicData.performQuery(query, inZoneWithID: nil) {
records, error in
if error != nil {
print(error?.localizedDescription)
}
}
if let users = results {
self.users = users
print("\nHow many users: \(self.users.count)\n")
if self.users.count != 0 {
self.aux = false
} else {
self.aux = true
}
print("\n\(self.aux)")
}
}
print("\n\(self.aux)")
return self.aux
}
は今のところ、私は0のユーザーを持っているので、self.aux
はloadUser()
が間違った値を返した後にのみ起こる等しいtrue
、する必要があります!ここでは、コンソールに表示される順序です:
false
USER ALREADY IN THE CLOUD
How many users: 0
true
それはtrue
なるが、これはtrue
に変化した時点で既に手遅れである必要があります! これを修正する方法を知っている人はいますか?どんな助けもありがとう!みんなありがとう!
非同期操作では通常の戻り値を使用できません。戻り値ではなく完了ハンドラで 'loadUser'を設定してください。 – rmaddy
'performQuery'を2回呼び出すのはなぜですか? – rmaddy
@rmaddyありがとう!それについて知らなかった。あなたの答えは本当に役に立ちました!! –