我有问题。我正在做一个具有登录功能的应用程序,并希望检查是否存在具有指定用户名的用户。所以我做了:
func doesRecordExist(inRecordType: String, withField: String, equalTo: String) -> Bool {
print(withField,equalTo)
var result = false
let predicate = NSPredicate(format: "\(withField) == %@", equalTo)
let query = CKQuery(recordType: inRecordType, predicate: predicate)
publicDatabase.perform(query, inZoneWith: nil, completionHandler: {results, er in
if results != nil {
print(results!.count)
if results?.count == 1 {
print(results!.count)
result = true
}
}
})
return result
}
在withField"用户名"将输入并输入相同的值将输入的值是用户名。
我做错了什么? 感谢。
修改
好吧,我终于想出了如何做rmaddy建议并且有效的方法。非常感谢你!
答案 0 :(得分:0)
如果函数的结果取决于异步操作的结果,则无法从函数返回值。如上所述,函数末尾的return result
行(值为false
)将在数据库查询开始之前很久就被调用。
您的doesRecordExist
函数需要使用perform
函数的多行完成处理程序参数。
当然,您需要重构代码,调用您的doesRecordExist
来处理您不会立即获得结果的事实。
答案 1 :(得分:0)
这是根据rmaddy的响应将您的代码转换为添加完成处理程序的原因,因为这应使您的代码在继续下一个代码之前等待结果。
func doesRecordExist(inRecordType: String, withField: String, equalTo: String, _ completion: @escaping (Bool) -> ()) {
print(withField,equalTo)
var result = false
let predicate = NSPredicate(format: "\(withField) == %@", equalTo)
let query = CKQuery(recordType: inRecordType, predicate: predicate)
publicDatabase.perform(query, inZoneWith: nil, completionHandler: {results, er in
if results != nil {
print(results!.count)
if results?.count == 1 {
print(results!.count)
result = true
}
}
})
completion(result)
}
然后您将代码在其他地方运行为:
doesRecordExist(inRecordType: String, withField: String, equalTo: String) { (result) in
if result == false {
//create new record here
}
}