group.notify 从未在 dispatchGroup 中调用

问题描述

我有组和队列

let group = dispatchGroup()
let queue = dispatchQueue(label: "downloadImages",attributes: .concurrent)

在我的函数中,我发送了 3 个请求

func getimages() {
        networkService.getimages(find: film.originalTitle) { [weak self] result in
            guard let self = self else { return }
            self.queue.async(group: self.group) {
                switch result {
                case let .success(posters):
                    guard let unwrappedPostersResult = posters?.results else { return }
                    self.posters?.append(contentsOf: unwrappedPostersResult)
                case let .failure(error):
                    self.view?.failure(error: error)
                }
            }
        }

        networkService.getimages(find: film.originalLanguage) { [weak self] result in
            guard let self = self else { return }
            self.queue.async(group: self.group) {
                switch result {
                case let .success(posters):
                    guard let unwrappedPostersResult = posters?.results else { return }
                    self.posters?.append(contentsOf: unwrappedPostersResult)
                case let .failure(error):
                    self.view?.failure(error: error)
                }
            }
        }

        networkService.getimages(find: "movies") { [weak self] result in
            guard let self = self else { return }
            self.queue.async(group: self.group) {
                switch result {
                case let .success(posters):
                    guard let unwrappedPostersResult = posters?.results else { return }
                    self.posters?.append(contentsOf: unwrappedPostersResult)
                case let .failure(error):
                    self.view?.failure(error: error)
                }
            }
        }

他们工作得很好,但是当我添加 dispatchGroup group.notify() 时从未调用

   group.notify(queue: .main) { [weak self] in
            guard let self = self else { return }
            self.view?.success()
        }

如何在完成请求后调用 group.notify()?

解决方法

创建 DispatchGroup() 时,需要为所有网络服务添加 group.enter() 和 group.leave()。

let group = DispatchGroup()
let queue = DispatchQueue(label: "downloadImages",attributes: .concurrent)
// Enter group
group.enter() 
networkService.getImages(find: film.originalTitle) { [weak self] result in
            guard let self = self else { return }
            self.queue.async(group: self.group) {
                switch result {
                case let .success(posters):
                    guard let unwrappedPostersResult = posters?.results else { return }
                    self.posters?.append(contentsOf: unwrappedPostersResult)
                  // leave group
                    group.leave()
                case let .failure(error):
                    self.view?.failure(error: error)
                   // leave group
                   group.leave()
                }
            }
        }