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

使用defer的一个更好的替代方案(不太容易出错,键入更少(:

let group = DispatchGroup()
let queue = DispatchQueue(label: "downloadImages", attributes: .concurrent)
// Enter group
group.enter() 
networkService.getImages(find: film.originalTitle) { [weak self] result in
// make sure to **always** leave group when execution exits scope 
defer {
group.leave()
}
guard let self = self else { return }
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)
}
}
}

最新更新