此问题不重复。
所以我有一个简单的函数,它将获取点击了什么tableview单元格的索引的参数,因此该函数将进入didSelectRowAt tableView函数,并且它还将返回一个String。
该函数名为getOpposingUserName,它连接到firebase以收集数据库中提供的信息。
现在我知道该功能的功能是一种逻辑错误,我不太了解。据我所知,无论何时尝试从firebase获取数据,它都会运行该代码并花费一秒钟来实际获取数据。但正如它所做的那样,它一直在运行下面的代码,你试图从数据库中获取数据。
这意味着如果我想返回一个String,那么字符串将始终为nil或我设置其初始值的任何内容,因为数据库将花费很长时间来加载,并且该函数已经通过代码运行以返回一些东西(这是我对它的理解,我确信有更多技术方法可以解释它)
所以基本上我要问的是我将如何加载"首先将数据转换为变量,然后检查firebase是否确实已将某些内容加载到变量中,然后返回变量以用于调用函数的任何内容
这个问题并不重复我已经阅读了这个问题,并试图在我自己的实现中理解它。我没有返回一个函数,当我阅读它时代码让我感到困惑。
这是我的函数代码
func getOpposingUsername(_ index: Int) -> String {
var opposingUser: String = ""
//the self.tieBetToUser just gets the randomized id from the bet in firebase don't need to worry about it
self.datRef.child("Bets").child(self.tieBetToUser[index]).observe(.childAdded, with: { snapshot in
guard let dict = snapshot.value as? [String: AnyHashable] else {
return
}
opposingUser = dict["OpposingUsername"] as! String
print(opposingUser) //this code actually never runs I found out
})
//sleep(4) this will not work and is actually bad code anyway different phones may be faster or slower
return opposingUser // will always return "" at the moment
}
这是互联网提供的解决方案
typealias someting = (String?) -> Void
func getOpposingUsername(completionHandler: @escaping someting, _ index: Int) {
var opposingUser: String = ""
self.datRef.child("Bets").child(self.tieBetToUser[index]).observe(.childAdded, with: { snapshot in
guard let dict = snapshot.value as? [String: AnyHashable] else {
return
}
opposingUser = dict["OpposingUsername"] as! String
if opposingUser.isEmpty {
completionHandler(nil)
} else {
completionHandler(opposingUser)
}
})
}
我究竟如何在其他地方调用此功能?喜欢 getOpposingUsername(somethingGoesHere,index.path)