布尔函数 returns 默认值,直到在 Firebase DB 中检查真实值 XCode Swift
Boolean function returns default value until real value checked in Firebase DB XCode Swift
我有以下布尔函数:
func checkIfLocateAcessGiven(uid: String) -> Bool {
print("checkIfLocateAcessGiven")
var currentUserID = UserDefaults.standard.string(forKey: "currentUserID")
var statusStr = false
print("checkIfLocateAcessGiven statusStr 1: \(statusStr)")
Database.database().reference().child("Locate").child(currentUserID!)
.observeSingleEvent(of: .value, with: { (dataSnapshot) in
if(dataSnapshot.exists()){
if(dataSnapshot.hasChild("RequestedTo")){
if(dataSnapshot.childSnapshot(forPath: "RequestedTo").hasChild(uid)){
var status = dataSnapshot.childSnapshot(forPath: "RequestedTo").childSnapshot(forPath: uid).value as! String ?? ""
if(status == "true"){
statusStr = true
print("checkIfLocateAcessGiven statusStr 2: \(statusStr)")
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 3: \(statusStr)")
}
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 4: \(statusStr)")
}
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 5: \(statusStr)")
}
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 6: \(statusStr)")
}
})
print("checkIfLocateAcessGiven statusStr 7: \(statusStr)")
return statusStr
}
当我调用这个函数时,我得到以下结果:
checkIfLocateAcessGiven
checkIfLocateAcessGiven statusStr 1: false
checkIfLocateAcessGiven statusStr 7: false
checkIfLocateAcessGiven statusStr 2: true
由于 false 一开始是 returned,我的代码采用不同的流程,后来 true 是 returned,我如何在布尔函数中等待直到检查实际值。大约有延迟。 1秒之间
checkIfLocateAcessGiven statusStr 7: false
和
checkIfLocateAcessGiven statusStr 2: true
我希望布尔值等待并检查实际值,然后 return 值,在本例中为 true 但当前 returning 假
有人可以帮我解决这个问题吗?
这是一个异步函数,这意味着它无法 return 同步获得它需要异步获取的结果,例如来自 Firebase 等 Web 服务的结果。
你不能(或者更确切地说不应该)等待它,而是使用回调来通知何时获得值。
如果您不了解异步编程,网上有很多 material,您绝对应该阅读更多相关内容,因为这个答案并不全面。
基本思想是您的异步函数接受一个将在完成时调用的闭包:
func checkIfLocateAcessGiven(uid: String, completion: (Bool) -> Void) {
// your setup code
Database.database().reference().child("Locate").child(currentUserID!)
.observeSingleEvent(of: .value, with: { (dataSnapshot) in
// checks, ifs, etc..
// whenever you have the result
completion(true) // or completion(false)
}
}
调用者将指定异步调用的完成回调:
print("before")
checkIfLocateAcessGiven(uid: "1234") { result in
print("async call result: ", result)
// do whatever you need to do with the result
}
print("after")
上面的输出是这样的:
before
after
async call result: true
前两行会立即接连打印,第三行需要一段时间,无论 Firebase 调用需要多长时间。
我有以下布尔函数:
func checkIfLocateAcessGiven(uid: String) -> Bool {
print("checkIfLocateAcessGiven")
var currentUserID = UserDefaults.standard.string(forKey: "currentUserID")
var statusStr = false
print("checkIfLocateAcessGiven statusStr 1: \(statusStr)")
Database.database().reference().child("Locate").child(currentUserID!)
.observeSingleEvent(of: .value, with: { (dataSnapshot) in
if(dataSnapshot.exists()){
if(dataSnapshot.hasChild("RequestedTo")){
if(dataSnapshot.childSnapshot(forPath: "RequestedTo").hasChild(uid)){
var status = dataSnapshot.childSnapshot(forPath: "RequestedTo").childSnapshot(forPath: uid).value as! String ?? ""
if(status == "true"){
statusStr = true
print("checkIfLocateAcessGiven statusStr 2: \(statusStr)")
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 3: \(statusStr)")
}
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 4: \(statusStr)")
}
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 5: \(statusStr)")
}
}else {
statusStr = false
print("checkIfLocateAcessGiven statusStr 6: \(statusStr)")
}
})
print("checkIfLocateAcessGiven statusStr 7: \(statusStr)")
return statusStr
}
当我调用这个函数时,我得到以下结果:
checkIfLocateAcessGiven
checkIfLocateAcessGiven statusStr 1: false
checkIfLocateAcessGiven statusStr 7: false
checkIfLocateAcessGiven statusStr 2: true
由于 false 一开始是 returned,我的代码采用不同的流程,后来 true 是 returned,我如何在布尔函数中等待直到检查实际值。大约有延迟。 1秒之间
checkIfLocateAcessGiven statusStr 7: false
和
checkIfLocateAcessGiven statusStr 2: true
我希望布尔值等待并检查实际值,然后 return 值,在本例中为 true 但当前 returning 假
有人可以帮我解决这个问题吗?
这是一个异步函数,这意味着它无法 return 同步获得它需要异步获取的结果,例如来自 Firebase 等 Web 服务的结果。
你不能(或者更确切地说不应该)等待它,而是使用回调来通知何时获得值。
如果您不了解异步编程,网上有很多 material,您绝对应该阅读更多相关内容,因为这个答案并不全面。
基本思想是您的异步函数接受一个将在完成时调用的闭包:
func checkIfLocateAcessGiven(uid: String, completion: (Bool) -> Void) {
// your setup code
Database.database().reference().child("Locate").child(currentUserID!)
.observeSingleEvent(of: .value, with: { (dataSnapshot) in
// checks, ifs, etc..
// whenever you have the result
completion(true) // or completion(false)
}
}
调用者将指定异步调用的完成回调:
print("before")
checkIfLocateAcessGiven(uid: "1234") { result in
print("async call result: ", result)
// do whatever you need to do with the result
}
print("after")
上面的输出是这样的:
before
after
async call result: true
前两行会立即接连打印,第三行需要一段时间,无论 Firebase 调用需要多长时间。