dispatchGroup.notify вызывается перед выполнением группы - быстро - программно

я использую DispatchGroup, DispatchSemaphore а также DispatchQueue для добавления элементов модели в правильном порядке в массив.

      fileprivate func getLatestImageForUids(_ uids: [String], completion: @escaping () -> Void){
    let db = Firestore.firestore()
    let today = Timestamp(date: Date())
    let yesterday = Timestamp(seconds: today.seconds-24*60*60, nanoseconds: 0)
    
    let dispatchGroup = DispatchGroup()
    let dispatchQueue = DispatchQueue(label: "any-label-name")
    let dispatchSemaphore = DispatchSemaphore(value: 0)
    
    dispatchQueue.async {
        uids.forEach { (userid) in
            dispatchGroup.enter()
            
            db.collection("Photos").whereField("timestamp", isGreaterThan: yesterday).order(by: "timestamp", descending: true).limit(to: 1).getDocuments { (snapshot, error) in
                
                if let error = error{
                    print(error.localizedDescription)
                    completion()
                    return
                }
                
                
                if snapshot?.documents.count == 1{
                    
                    guard let dict = snapshot?.documents.first?.data() else { return }
                    guard let uid = dict["uid"] as? String else { return }
                    guard let lastPostedUrl = dict["thumbnailUrl"] as? String else { return }
                    
                    self.getUsername(for: uid) { (username) in
                        let comprehensiveDict : [String : Any] = [
                            "username" : username,
                        ]
                        var model = Model()
                        model.initiateBoundModelWith(dict: comprehensiveDict)
                        self.boundMomentsList.append(model)
                        
                        dispatchSemaphore.signal()
                        dispatchGroup.leave()
                        
                        self.collectionView.reloadData()
                        completion()
                    }
                    
                }
                
            }
            
            dispatchSemaphore.wait()
        }
    }
    
    dispatchGroup.notify(queue: DispatchQueue.main, execute: {
           print("All Done")
    })
}

проблема в том, что dispatchGroup.notify называется еще раньше dispatchGroup начинает свою работу, а я хочу, чтобы она завершилась после.

Для полноты картины добавляю также метод getUsername который асинхронно извлекает имя пользователя:

      fileprivate func getUsername(for uid : String, completion: @escaping (String) -> Void){
        let db = Firestore.firestore()
        db.collection("UserCollection").document(uid).getDocument { (doc, error) in
            if let error = error{
                print(error.localizedDescription)
                return
            }
            guard let dict = doc?.data() else { return }
            guard let name = dict["name"] as? String else { return }
            completion(name)
        }
    }

0 ответов

Другие вопросы по тегам