Использование диспетчеризации для ожидания добавления данных в массив? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь загрузить данные из Firestore, добавить их в один массив для сортировки, а затем добавить их в другой массив после сортировки всех данных. У меня есть диспетчерская группа, которая управляет загрузкой всех данных, прежде чем двигаться дальше, однако я не знаю, как и где добавить отсортированный массив (temparray1 / temparray2) в главный массив (closeunisSameCourse / nearUnis). Я попытался использовать dispatch.wait, чтобы дождаться добавления обоих временных массивов, но он просто зависает.

func nearbyUnisSameCourse(completion: @escaping (_ success: Bool) -> Void) {
        DispatchQueue.main.async {
            self.spinner.startAnimating()
        }
        self.dispatchGroup.enter()
        service.loadUniversityAndCourse { (uni, course) in
        defer{ self.dispatchGroup.leave() }
        let nearbyUnis = ClosestUnis()
        let closeUniArray = nearbyUnis.getClosestUnis(University: uni)
        for uni in closeUniArray {
            let UniRef = Firestore.firestore().collection("User-Universities").document(uni)
                self.dispatchGroup.enter()
                UniRef.getDocument { (snapshot, error) in
                defer{ self.dispatchGroup.leave() }
            if let error = error{
                print(error.localizedDescription)
            }
            else {
                //append their data to an array
                guard let data = snapshot?.data() else {return}
                let stringArray = Array(data.keys)
                for user in stringArray {
                    self.dispatchGroup.enter()
                    let usersRef = Firestore.firestore().collection("users").document(user)
                    usersRef.getDocument { (snapshot, error) in
                    defer{ self.dispatchGroup.leave() }
                if let error = error {
                    print(error.localizedDescription)
                }
                else {
                    let data = snapshot?.data()
                    if let dictionary = data as [String:AnyObject]? {
                    let Info = UserInfo(dictionary: dictionary)
                        
                        if Info.Course == course {
                           print(Info.username!)
                           self.tempArray1.append(Info)
                           self.tempArray1.sort { (time1, time2) -> Bool in
                               return Double(time1.Created!.seconds) > Double(time2.Created!.seconds)
                                }
                            self.closeunisSameCourse.append(contentsOf: self.tempArray1)
                            self.tempArray1.removeAll()
                            
                        }
                            else {
                                self.tempArray2.append(Info)
                                print(Info.username!)
                            self.tempArray2.sort { (time1, time2) -> Bool in
                                    return Double(time1.Created!.seconds) > Double(time2.Created!.seconds)
                                }
                            }
                        
                        }
                    }
                }
                    //end of for user loop
                }
                //outside user for loop
                print("now appending")
                self.nearbyUnis.append(contentsOf: self.tempArray2)
                print(self.nearbyUnis.description)
                self.tempArray2.removeAll()
                
                }}}}
        
            self.dispatchGroup.notify(queue: .main) {
            print("Finished")
            //self.spinner.stopAnimating()
            //print(self.nearbyUnis.description)
            self.tableView.reloadData()
            completion(true)
            }
        }
}

1 Ответ

1 голос
/ 12 июля 2020

исправлено сортировкой по имени

else {
    self.nearbyUnis.append(Info)
    print(Info.username!)
    self.nearbyUnis.sort { (time1, time2) -> Bool in
    return Double(time1.Created!.seconds) > 
    Double(time2.Created!.seconds)}
    self.nearbyUnis.sort { (uni1, uni2) -> Bool in
    return uni2.University! > uni1.University!}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...