【发布时间】:2017-04-12 10:15:44
【问题描述】:
我正在制作一个应用程序,通过在图表中显示数据来显示过去 30 天内两种货币之间的汇率。我正在使用 Alamofire 和 SwiftyJSON 来解析响应。我使用的 API 是http://fixer.io。
在我的视图控制器中,我有一个名为 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 天内的每一天存储一个Date。 self.currency 是另一个视图控制器传递给此视图控制器的枚举类型值。 self.currency.currencyCode 是一个计算属性,它返回由枚举表示的货币的货币代码,例如"GBP"。基本上,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 个请求何时都得到响应以及是否发生任何错误?
【问题讨论】: