イメージをダウンロードするための反復を設定しようとしています。全体のプロセスは機能しますが、コンソールの出力を見てみると、何かが間違っているようです。非同期の反復でDispatchGroupを設定するにはどうすればよいですか?
func download() {
let logos = [Logos]()
let group = DispatchGroup()
logos.forEach { logo in
print("enter")
group.enter()
if logo?.data == nil {
let id = logo?.id as! String
if let checkedUrl = URL(string: "http://www.apple.com/euro/ios/ios8/a/generic/images/\(id).png") {
print(checkedUrl)
LogoRequest.init().downloadImage(url: checkedUrl) { (data) in
logo?.data = data
print("stored")
group.leave()
print("leave")
}
}
}
}
print("loop finished")
}
出力:
enter
http://www.apple.com/euro/ios/ios8/a/generic/images/og.png
enter
http://www.apple.com/euro/ios/ios8/a/generic/images/eg.png
enter
http://www.apple.com/euro/ios/ios8/a/generic/images/sd.png
enter
http://www.apple.com/euro/ios/ios8/a/generic/images/hd.png
loop finished
stored
leave
stored
leave
stored
leave
stored
leave
反復が全てで)(DispatchGroupを入力して残して気にしないように見えます。ウェブリクエストはほぼ同時に発生します。私の意見では、出力は次のようになります:
enter
http://www.apple.com/euro/ios/ios8/a/generic/images/og.png
stored
leave
enter
http://www.apple.com/euro/ios/ios8/a/generic/images/eg.png
stored
leave
...
loop finished
私は何かを監督しましたか?いくつかのアイデアを得るのは素晴らしいだろう。
group.notify(queue: .main) {
print("loop finished")
}
代わりに通常の印刷の:これについて
はDispatchGroupが正しく動作しないことを唯一の問題ですか?または、ウェブリクエストの処理方法に関する操作上の問題はありますか? – AgnosticDev
これは、リクエストの送信が完了した時点で「ループが終了しました」という印刷が行われているためです。 J. Doe氏によると、これらのディスパッチグループのすべてが完了したときに通知を受けたい場合は、 'group.notify'を使用してください。 – Rob
関連していませんが、 'logo?.data'のいずれかが' nil'でなかった場合、またはURLのアンラップが失敗した場合、あなたの 'group.enter()'と 'group.leave()'コールはアンバランスになり、あなたのグループ終了しません。それはここでは問題ではありませんが、これには注意が必要です。あなたは、 'enter'と' leave'コールが常に1対1のバランスをとるようにしたいと思っています。 – Rob