首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 5协调后台任务

Swift 5协调后台任务
EN

Stack Overflow用户
提问于 2020-03-11 16:04:42
回答 2查看 57关注 0票数 0

我仍然在尝试理解和控制异步任务。我有一个应用程序,这是生成多个API调用不同的供应商。我最多可以并行执行367个API调用。我如何协调所有这些,以便我可以知道第一个开始和最后一个完成的时间?

有了这个论坛的帮助,我可以让它在单个呼叫下工作,而不是多个呼叫。

下面是我在一个类中对API的调用(相关小节介绍了.completion的用法:

代码语言:javascript
复制
let session = URLSession.shared
    let url = components.url!
    let request = URLRequest(url: url)

    session.dataTask(with: request) { data, response, error in
        if let error = error {
            DispatchQueue.main.async {
                completion(.failure(error))
            }
            return
        }

        guard
            let responseData = data,
            let httpResponse = response as? HTTPURLResponse,
            200 ..< 300 ~= httpResponse.statusCode
        else {
            DispatchQueue.main.async {
                completion(.failure(AstronomicalTimesError.invalidResponse(data, response)))
            }
            return
        }

        do {
            print("Astronomical times api completed with status code ", httpResponse.statusCode)
            let astronomicalTimesResponse = try JSONDecoder().decode(AstronomicalTimesResponse.self, from: responseData)
            DispatchQueue.main.async {
                completion(.success(astronomicalTimesResponse))
                //print("astronomical times loaded ", astronomicalTimesResponse)
            }
        } catch let jsonError {
            DispatchQueue.main.async {
                completion(.failure(jsonError))
            }
        }
    }.resume()

然后针对日期范围内的每一天调用此方法。

代码语言:javascript
复制
repeat {
        let astronomicalTimes = AstronomicalTimes(date: astRetrievalDate, latitude: station.lat, longitude: station.long)

        astronomicalTimes.start { result in
            switch result {
                case .success(let astronomicalTimesResponse):
                    let detail = DayDetails(date: astRetrievalDate, astronomicalTimes: astronomicalTimesResponse.results)
                    details.append(detail)
                case .failure(let error):
                    print("Astronomical Times API call from saved tides failed with error \(error)")
            }
        }
        astRetrievalDate = astRetrievalDate.dayAfter
    } while astRetrievalDate.noon <= toDate.noon

    let tideToSave = SavedTides(saveKey: key, details: details)
    savedTides.append(tideToSave)
    print("saved tide details: ", savedTides)

我想在savedTides中构建结果,但是,在赋值给savedTides之后,所有的API都完成了,所以这总是空的。请注意,我还将向不同的提供程序触发另外两个单独的API,因此在将所有这些API的结果分配给一个数组之前,我需要完成所有这些API。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-11 17:30:04

你为什么不看看promises呢?因此,您可以在完成之前需要完成的其他调用时触发其他调用。

https://github.com/mxcl/PromiseKit

您可以将多个promises组合到一个数组中,并将它们放在一起,或者DispatchGroup可以帮助您。

票数 0
EN

Stack Overflow用户

发布于 2020-03-13 17:47:57

谢谢大家。DispatchGroup就是答案。我真的很难从苹果的文档中理解如何使用它,然而我偶然发现了这篇优秀的教程,一切都很清楚。How to use DispatchGroup in Swift 4.2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60631564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档