2017-07-04 9 views
0

イメージをダウンロードするための反復を設定しようとしています。全体のプロセスは機能しますが、コンソールの出力を見てみると、何かが間違っているようです。非同期の反復で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") 
} 

代わりに通常の印刷の:これについて

+0

はDispatchGroupが正しく動作しないことを唯一の問題ですか?または、ウェブリクエストの処理方法に関する操作上の問題はありますか? – AgnosticDev

+0

これは、リクエストの送信が完了した時点で「ループが終了しました」という印刷が行われているためです。 J. Doe氏によると、これらのディスパッチグループのすべてが完了したときに通知を受けたい場合は、 'group.notify'を使用してください。 – Rob

+0

関連していませんが、 'logo?.data'のいずれかが' nil'でなかった場合、またはURLのアンラップが失敗した場合、あなたの 'group.enter()'と 'group.leave()'コールはアンバランスになり、あなたのグループ終了しません。それはここでは問題ではありませんが、これには注意が必要です。あなたは、 'enter'と' leave'コールが常に1対1のバランスをとるようにしたいと思っています。 – Rob

答えて

2

何。

編集:

func download() { 

let logos = [Logos]() // NSManagedObject 
let group = DispatchGroup() 

logos.forEach { logo in 


    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) 
      print("enter") 
      group.enter() 
      LogoRequest.init().downloadImage(url: checkedUrl) { (data) in 
       //this is async I think 

       coin?.logo = data 
       print("stored") 

       group.leave() 
       print("leave") 
      } 
     } 
    } 
} 

group.notify(queue: .main) { 
print("loop finished") 
} 
} 
+0

私はそれを試しましたが、何も変えていません。これはループの後/外側ですが、ループ自体を中断する必要があります。 –

+0

@JoschHazardこの編集が有効かどうかを確認できますか? –

+0

@ J. Doe:私はそれを試しました。不幸にもそれはしません。 –

関連する問題