私はチャートにデータを提示することで過去30日間の2つの通貨間の為替レートを表示するアプリを作っています。私はAlamofireとSwiftyJSONを使って応答を解析しています。私が使用しているAPIはhttp://fixer.ioです。30件のAlamofireリクエストがすべて応答されたことを検出するにはどうすればよいですか?
私のビューコントローラーでは、rates
という辞書([Date: Double]
)を入力するgetRate
というこのメソッドがあります。 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
は、過去30日間に、毎日のためにDate
を格納し、タイプ[Date]
の定数、です。 self.currency
は、別のView ControllerによってこのView Controllerに渡される列挙型の値です。 self.currency.currencyCode
は、enumで表される通貨の通貨コードを返す計算されたプロパティです。 "GBP"
。基本的にgetRate
は30件のリクエストを作成し、応答値をrates
辞書に追加しています。
私がしたいのは、30件のリクエストがエラーなく返された後、為替レートに従ってチャートがプロットされます。現在、辞書に30のエントリがあるかどうかを確認します。存在する場合は、グラフをリフレッシュしてください:
var rates: [Date: Double] = [:]
{
didSet {
if rates.count == 30 {
refreshCharts()
}
}
}
「更新」ボタンを追加するまでは正常に機能しました。ユーザーがリフレッシュすると、30回同じリクエストをもう一度やりたいそれらがすべて正常に成功した場合は、rates
に新しい値を入力します。 1つ以上のエラーが発生した場合は、rates
の値を変更せずに保持する、つまり古いデータを保持します。
これを行うには、30のリクエストがすべて応答されたかどうか、エラーがあるかどうかを知る必要があります。 if rates.count == 30
のトリックを使用することはできません。ユーザーが更新すると、rates
には既に古い値が設定されているためです。 rates
を最初に空にすることはできません。古いデータが失われるためです。エラーが発生した場合に表示する必要があります。 getRate
の先頭にエラーがないことを保証するものではありません。
基本的に30件すべてのリクエストに応答したときとエラーが発生したかどうかを確認する方法?
ために同じことを行うことができますか?何が起こる可能性がありますか? – Sweeper
答えを編集して、スレッドの安全性をどのように達成できるかを示しました。基本的に、複数のキューから同時に変数に書き込もうとすると、これらの書き込みの一部を削除することができます。あなたのケースでは、たとえすべてのネットワーク要求が完璧に機能したとしても、30個の値のうち29個だけが存在する可能性があります。 – XML
さて、 'self.rates'にはどこに応答値を割り当てるべきですか? 'group.notify'ブロックでは?しかし、私はそこの回答にアクセスすることはできませんよね? – Sweeper