我试图在用户播放上一个问题后从服务器获取下一个问题。 当arrayNum更改时,无法获取下一个问题。我想用switch方法一遍又一遍地编写相同的代码。还有更好的方法吗?
func retriveRoom(){
let idRef = db.collection("ROOMS_Collection").document(GameData.shared.documentID)
idRef.getDocument { (docSnapshot, error) in
guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}
guard let data = docSnapshot.data() else { return }
let questionID = data["questionID"] as? Array<Int>
let questionRef = self.db.collection("QUESTIONS_Collection").document("\(questionID![self.arrayNum])")
questionRef.getDocument{ (docSnapshot, error) in
guard let docSnapshot = docSnapshot, docSnapshot.exists else { return }
let data = docSnapshot.data()
self.questionArray = (docSnapshot.data()?.compactMap({_ in Question(dictionary: data!)}))!
let question = self.questionArray[0]
self.answer = Int(question.answer)!
self.questionText.fontColor = UIColor.white
self.questionText.fontName = "Verdana"
self.questionText.text = ("\(question.question)")
self.questionText.fontSize = 24.0
self.questionText.numberOfLines = 0
self.questionText.lineBreakMode = NSLineBreakMode.byWordWrapping
self.questionText.zPosition = 5
self.questionText.position = CGPoint(x: (self.questionBackground?.frame.midX)! - 5, y: (self.questionBackground?.frame.midY)! - 5)
self.questionText.preferredMaxLayoutWidth = (self.questionBackground?.frame.width)! - 10
self.addChild(self.questionText)
}
}
}
答案 0 :(得分:0)
如果我理解您正在尝试正确执行的操作,则需要在arrayNum更改时从数据库中获取另一个问题。我认为你最好的办法是在你的arrayNum变量上尝试一个属性观察函数。像这样:
在声明arrayNum的类声明中:
var arrayNum : Int {
didSet {
// Implement retrieveRoom() here
retrieveRoom()
}
}
您的代码中不清楚的是arrayNum何时以及如何更改。作为didSet的替代方法,您还可以使用willSet,顾名思义,它将在重新分配参数值时调用。你可以在这里阅读:
(顺便说一句,如果您要一次性获取一批问题而不是每次需要新问题时重复数据库调用,它可能会更好地为您的用户体验提供服务。但这与您的用户并不完全相关问题。)
希望有所帮助。