布尔函数 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 调用需要多长时间。