我正在从Firebase中读取数据,并希望使用一个闭包来意识到何时调用完成。我的代码是这样的。
func fetchGameTexts(gameType : String, completion: @escaping ([String]) -> ()){
var fetchedArray = [String]()
ref.child("GameTexts").child("JagHarAldrig").observe(.childAdded) { (snapshot, error) in
if let userDict = snapshot.value as? [String:Any] {
let userDictValue = userDict.values
fetchedArray.append("\(userDictValue.first!)")
}
completion(fetchedArray)
}
}
调用函数
let FetchGameText = FetchGameTexts()
FetchGameText.fetchGameTexts(gameType : "JagHarAldrig") { fetchedArray in
print("inside completion handler : \(fetchedArray)")
}
现在网络调用按预期工作了,但完成处理程序没有工作,它一次又一次地打印数组,而不是在调用完成时打印。
我试着把 "completion(fetchedArray) "移到if let块里面,也移到ref调用外面。也没有成功。
感谢大家的帮助。
EDIT:
把调用的方法改成了下面的样子,回调成功了,但是输出打印了键,值和额外的信息,我不想要。我只需要值。有什么好办法吗?
func fetchGameTexts(gameType : String, completion: @escaping ([String]) -> ()){
var fetchedArray = [String]()
ref.child("GameTexts").child(gameType).observe(.value) { (snapshot, error) in
for child in snapshot.children {
fetchedArray.append("\(child)")
}
completion(fetchedArray)
}
}
似乎你实现完成和Firebase调用的方式没有问题。每当父体发生变化时,完成块就会被多次调用(或者如果我没记错的话,它将为你当前拥有的每一个子体在开始时被调用),因为你在监听 .childAdded
. 它将继续这样做,直到你把监听器从 ref
.
我的假设是,你想获取所有的孩子,所以你需要使用 .value
以便一次性获得所有的信息。
为此,这个可能也会有帮助。https:/firebase.google.comdocsdatabaseioslists-of-data。