使用 swift 检查 CloudKit 中是否存在具有指定值的记录
Check existance of record with a specified value in CloudKit using swift
我有问题。我正在做一个具有登录功能的应用程序,想检查是否存在具有指定用户名的用户。所以我做了:
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 "username" 中输入,在 equalTo 中将输入值,即用户名。
我做错了什么?
谢谢
编辑
好吧,我终于想出了如何做 rmaddy 建议的事情并且它起作用了。非常感谢!
如果函数的结果取决于异步操作的结果,则您不能 return 来自函数的值。正如所写,函数末尾的 return result
行(值为 false
)将在数据库查询开始之前很久就被调用。
您的 doesRecordExist
函数需要在 perform
函数的大部分行中使用完成处理程序参数。
当然,您需要重构调用您的 doesRecordExist
的代码,以应对您不会立即返回结果的事实。
根据 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
}
}
我有问题。我正在做一个具有登录功能的应用程序,想检查是否存在具有指定用户名的用户。所以我做了:
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 "username" 中输入,在 equalTo 中将输入值,即用户名。
我做错了什么? 谢谢
编辑
好吧,我终于想出了如何做 rmaddy 建议的事情并且它起作用了。非常感谢!
如果函数的结果取决于异步操作的结果,则您不能 return 来自函数的值。正如所写,函数末尾的 return result
行(值为 false
)将在数据库查询开始之前很久就被调用。
您的 doesRecordExist
函数需要在 perform
函数的大部分行中使用完成处理程序参数。
当然,您需要重构调用您的 doesRecordExist
的代码,以应对您不会立即返回结果的事实。
根据 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
}
}