在我的ViewController类的顶部,我有这个变量:
var allInCategory: Int = 0
然后在ViewDidLoad中我调用了一个函数和一个变量的print:
getRandomQuestion()
print(allInCategory)
在该功能中,我有一个Firebase电话:
let queryRef2 = FIRDatabase.database().reference().child("Questions").child(cat)
queryRef2.observeSingleEvent(of: .value, with: { snapshot in
self.allInCategory = Int(snapshot.childrenCount)
})
我似乎在修改变量时遇到了一些问题。在控制台中输出:
0
如果我把print变量放在这样的函数中:
let queryRef2 = FIRDatabase.database().reference().child("Questions").child(cat)
queryRef2.observeSingleEvent(of: .value, with: { snapshot in
self.allInCategory = Int(snapshot.childrenCount)
print(self.allInCategory)
})
控制台中的输出为:
0
30
我想也许这可能是由于从firebase获取该请求所需的时间。所以我将它包装在一个像这样的调度组中:
viewDidLoad中:
getRandomQuestion()
group.notify(queue: DispatchQueue.main, execute: {
print("left group")
print(self.allInCategory)
})
并在函数中:
group.enter()
let queryRef2 = FIRDatabase.database().reference().child("Questions").child(cat)
queryRef2.observeSingleEvent(of: .value, with: { snapshot in
self.allInCategory = Int(snapshot.childrenCount)
})
group.leave()
但现在控制台输出是这样的:
左组
0
任何人都可以帮我解决这个问题吗?我希望这不是完全没用的东西,我想念。
答案 0 :(得分:0)
您需要将group.leave()
放在完成块内。这是处理异步调用的正确方法。
group.enter()
let queryRef2 = FIRDatabase.database().reference().child("Questions").child(cat)
queryRef2.observeSingleEvent(of: .value, with: { snapshot in
self.allInCategory = Int(snapshot.childrenCount)
group.leave()
})