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)
}
}