[解決済み] 非同期ネットワークリクエストのswift forループの実行が終了するまで待つ
2022-04-24 11:47:14
質問
for inループでfirebaseに大量のネットワークリクエストを送信し、メソッドの実行が終了したら新しいビューコントローラにデータを渡したいのです。以下は私のコードです。
var datesArray = [String: AnyObject]()
for key in locationsArray {
let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)")
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
datesArray["\(key.0)"] = snapshot.value
})
}
// Segue to new view controller here and pass datesArray once it is complete
いくつか気になる点があります。まず、forループが終了して、すべてのネットワークリクエストが完了するまで、どのように待てばいいのでしょうか?私はobserveSingleEventOfType関数を修正することができません、それはfirebase SDKの一部です。また、forループの異なる反復からdatesArrayにアクセスしようとすることで、ある種のレースコンディションを作成するのでしょうか(それが意味をなすことを願っています)?私はGCDとNSOperationについて読んできましたが、これは私が作った最初のアプリなので、私は少し迷っています。
注:Locations配列は、私がfirebaseでアクセスする必要があるキーを含む配列です。また、ネットワークリクエストは非同期で実行されることが重要です。私は、datesArrayを次のビューコントローラに渡す前に、すべての非同期リクエストが完了するまで待ちたいのです。
解決方法は?
を使用することができます。 ディスパッチグループ を使用すると、すべてのリクエストの終了時に非同期コールバックを起動することができます。
以下は、ディスパッチグループを使って、複数のネットワーキング・リクエストがすべて終了したときに、非同期にコールバックを実行する例です。
override func viewDidLoad() {
super.viewDidLoad()
let myGroup = DispatchGroup()
for i in 0 ..< 5 {
myGroup.enter()
Alamofire.request("https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON { response in
print("Finished request \(i)")
myGroup.leave()
}
}
myGroup.notify(queue: .main) {
print("Finished all requests.")
}
}
出力
Finished request 1
Finished request 0
Finished request 2
Finished request 3
Finished request 4
Finished all requests.
関連
-
[解決済み] これを解決するにはどうしたらいいのでしょうか。UILabel.textは、メインスレッドからのみ使用する必要があります。
-
[解決済み] タイプ 'StorageMetadata' の値には、メンバー 'downloadURL' がありません。
-
[解決済み] なぜswiftではアンダースコアが必要なのですか?
-
[解決済み] Pythonリクエストによる非同期リクエスト
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み】SwiftのwillSetとdidSetの目的は何ですか?
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み】ReactiveCocoaとRxSwiftの比較 - 長所と短所?
-
[解決済み】Swiftで辞書に要素を追加する方法は?
-
[解決済み] Swift言語でのエラーハンドリング
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] スウィフト 2: !, ?-" オプション型「...」の値がアンラップされていない"
-
[解決済み] Swiftでbase64StringをStringに変換する方法とは?
-
[解決済み] Swift 3でdispatch_onceはどうなる?
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み] SwiftでString.Indexはどのように動作するのか
-
[解決済み】Xcode 6 Beta 4でアプリを実行すると「表示権限がないため、ファイル "MyApp.app" を開くことができません。
-
[解決済み】swift 4でenumをDecodableにするにはどうすればいいですか?
-
[解決済み】Swiftで弱参照の配列を宣言するには?
-
[解決済み】Swiftで列挙型の値の名前を取得する方法は?
-
[解決済み】UIViewControllerの最上位機種を取得する。