gpt4 book ai didi

ios - 如何检测所有 30 个 Alamofire 请求都已响应?

转载 作者:行者123 更新时间:2023-11-28 10:14:19 26 4
gpt4 key购买 nike

我正在制作一个应用程序,通过在图表中显示数据来向您显示过去 30 天内两种货币之间的汇率。我正在使用 Alamofire 和 SwiftyJSON 来解析响应。我使用的 API 是 http://fixer.io .

在我的 View Controller 中,我有一个名为 getRate 的方法,它将填充名为 rates 的字典 ([Date: Double])。 getRate会在viewDidLoad中调用,定义如下:

func getRate() {
let baseCurrency = UserDefaults.standard.string(forKey: "baseCurrency")
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
for date in last30Days {
let dateString = formatter.string(from: date)
let url = "https://api.fixer.io/\(dateString)?base=\(baseCurrency!)&symbols=\(self.currency!)"
Alamofire.request(url).responseString {
[weak self]
response in
if let _ = response.error {
return
}

let json = JSON(parseJSON: response.value!)
if let _ = json["error"].string {
return
}

if self != nil {
if let rate = json["rates"][self!.currency.currencyCode].double {
self!.rates[date] = rate
}
}
}
}
}

last30Days 是一个常量,类型为 [Date],存储过去 30 天内每一天的 Dateself.currency 是一个由另一个 View Controller 传递给这个 View Controller 的枚举类型值。 self.currency.currencyCode 是一个计算属性,它返回由枚举表示的货币的货币代码,例如“英镑”。基本上,getRate 发出 30 个请求并将响应值添加到 rates 字典。

我想做的是在所有 30 个请求都被无误响应后,根据汇率绘制图表。目前,我检查字典是否有 30 个条目。如果是,请刷新图表:

var rates: [Date: Double] = [:]
{
didSet {
if rates.count == 30 {
refreshCharts()
}
}
}

在我想添加一个“刷新”按钮之前,它工作正常。当用户刷新时,我想再次发出相同的 30 个请求。如果它们都成功且没有错误,请使用新值填充 rates。如果发生一个或多个错误,我想保持 rates 的值不变,即保留旧数据。

为此,我必须知道所有 30 个请求何时都已得到响应以及是否有任何错误。我不能再使用 if rates.count == 30 技巧了,因为当用户刷新时,rates 已经填充了旧值。我不能一开始就将rates设置为空,因为那样会丢失旧数据,需要在出现错误时显示。我不能保证 getRate 开始时没有错误。

基本上,我如何知道所有 30 个请求何时得到响应以及是否发生任何错误

最佳答案

您可以使用 DispatchGroup:

let group = DispatchGroup()
var errors: [Error] = []

for date in last30Days {
group.enter()

// ...

Alamofire.request(url).responseString {
defer { group.leave() }
guard let error = response.error else {
errors.append(error)
return
}

// ...
}
}

group.notify(queue: .main) {
// All requests are finished now
}

请注意,errors 数组不是线程安全的(与您的字典相同)。

编辑:为了线程安全,您可以将更新分派(dispatch)到队列中,以确保不会同时从不同线程修改变量。

let queue = DispatchQueue(label: "queue")
var errors: [Error] = []
for date in last30Days {
// ...
queue.async {
errors.append(error)
}
// ...
}

你可以对你的字典做同样的事情

关于ios - 如何检测所有 30 个 Alamofire 请求都已响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com