Firebase异步调用:如何构建我的调度组

时间:2018-08-05 01:10:03

标签: swift firebase asynchronous firebase-realtime-database dispatch-async

我有一个程序,正在使用Firebase异步调用将数据加载到collectionview中。我的代码如下。如您所见,我使用第一个调度组来确保方法getUserGender()和getUserMatchPreferences()在触发方法checkWhatPoolToDrawFrom()之前已经完成,因为这两个方法都返回必须由该方法访问的导入信息。这部分工作正常。现在,我遇到的问题是因为在完成上述方法之后,我需要调用此方法getArray()以将数据加载到我的collectionView中。我以为可以通过创建第二个调度组并在此方法getArray完成后重新加载数据来做到这一点,但是这种方法不起作用(我知道这是因为在调度组2闭包中,当我打印阵列时,我得到一个空数组)。我究竟做错了什么?构建我的调度组和请求的正确方法是什么?

var userMatchPreferences=String()
var userGender=String()
var poolToDraw5=String()
var peopleArray:[String]=[String]()
var randomNumberArray:[Int]=[Int]()
var finalPeopleArray=[String]()
let dispatchGroup=DispatchGroup()
let dispatchGroup2=DispatchGroup()
override func viewDidLoad() {
    super.viewDidLoad()
    peopleArray.removeAll()
    randomNumberArray.removeAll()
    finalPeopleArray.removeAll()
    getUserGender()
    getUsersMatchPreferences()
    dispatchGroup.notify(queue: .main) {
        self.checkWhatPoolToDraw()
        print(self.poolToDraw5)
         self.getArray()
        }

    dispatchGroup2.notify(queue: .main) {
        print(self.finalPeopleArray)
        self.collectionView.reloadData()
    }


func getUsersMatchPreferences(){
   dispatchGroup.enter()
    let currentUser=Auth.auth().currentUser!

    let dataRef=Database.database().reference()
    dataRef.child("Users").child(currentUser.uid).observeSingleEvent(of: .value) { (snapshot) in
        if let dictionary=snapshot.value as? [String:AnyObject]{

            self.userMatchPreferences=dictionary["AttractedTo"] as! String
             self.dispatchGroup.leave()

        }


    }


}

func getArray(){

    dispatchGroup2.enter()
        Database.database().reference().child(poolToDraw5).observeSingleEvent(of: .value) { (snapshot) in

        let dict=snapshot.value as! NSDictionary
        print(dict)
        self.peopleArray=dict.allKeys as! [String]
        self.getRandomizedNumbers()
        for i in 0...self.randomNumberArray.count-1{
            let randomNumber=self.randomNumberArray[i]
            let randomID=self.peopleArray[randomNumber]
            self.finalPeopleArray.append(randomID)


        }

        for i in 0...self.finalPeopleArray.count-1{
            Database.database().reference().child("Users").child(Auth.auth().currentUser!.uid).child("oldPotentialMatches").child(self.finalPeopleArray[i]).setValue(self.finalPeopleArray[i])
        }
            self.dispatchGroup2.leave()

    }

}

0 个答案:

没有答案