【发布时间】:2016-05-01 20:36:21
【问题描述】:
我在一个项目中使用 CloudKit,我正在从云端加载数据以检查用户是否已经在云端,但是当我调用 loadUser() 函数时,代码已经返回了一个值 BEFORE实际值出现!代码如下:
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 应该等于 true,这只会发生在 loadUser() 返回错误值之后!这是控制台中出现的顺序:
false
USER ALREADY IN THE CLOUD
How many users: 0
true
应该是true,但当它更改为true 时已经太晚了!
有谁知道如何解决这个问题?非常感谢任何帮助!谢谢各位!
【问题讨论】:
-
在处理异步操作时不能使用正常的返回值。使用完成处理程序而不是返回值设置
loadUser。 -
为什么你有两个电话给
performQuery,一个在另一个里面? -
@rmaddy 非常感谢!不知道那件事。你的回答真的很有帮助!!
-
@rmaddy 哦,这是一个错误,我已经在我的代码中去掉了它!