如何在单个失败时中止整个调度组操作而不返回多个失败完成处理程序?

问题描述

我在循环中使用调度组来跟踪网络请求数组,以便当它们全部成功完成时,成功完成处理程序仅返回一次。

但是,如果发生单个故障,我想中止整个操作并只返回一次故障完成处理程序。我面临的问题是所有失败完成处理程序都返回多次。这不是我想要的。

我的代码看起来像这样。

class NetworkClient {
    // ...
    func fetchBlogPosts(completion: @escaping (Result<[BlogPost],NetworkClientError>) -> Void) {
        let dispatchGroup = dispatchGroup()
        var blogPosts     = [BlogPost]()
        
        for (index,value) in blogPostJSONURLs.enumerated() {
            dispatchGroup.enter()
            
            guard let jsonURL = URL(string: blogPostJSONURLs[index]) else {
                dispatchGroup.leave()
                completion(.failure(.invalidURL))
                return
            }
            
            let dataTask = URLSession.shared.dataTask(with: jsonURL) { data,response,error in
                if error != nil {
                    dispatchGroup.leave()
                    completion(.failure(.errorReturned))
                    return
                }
                
                guard let httpResponse = response as? HTTPURLResponse,(200...299).contains(httpResponse.statusCode) else {
                    dispatchGroup.leave()
                    completion(.failure(.serverError))
                    return
                }
                
                guard let data = data else {
                    dispatchGroup.leave()
                    completion(.failure(.noData))
                    return
                }
                
                do {
                    let blogPost = try JSONDecoder().decode(BlogPost.self,from: data)
                    blogPosts.append(blogPost)
                    dispatchGroup.leave()
                } catch {
                    dispatchGroup.leave()
                    completion(.failure(.FailedToDecodeJSON))
                }
            }
            
            dataTask.resume()
        }
        
        dispatchGroup.notify(queue: .main) {
            completion(.success(blogPosts))
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)