2016-09-29 12 views
0

intenetのダウンロード要求から補完ブロックのタイミングについてよく知りたいです。この場合の火災基地。次のコード例は何もしませんが、私の質問を示しています。非同期コールバックのタイミング

は、私がkeysArrayに100個の値を持っていると言う、100 firebaseする非同期リクエストと終了ブロックが存在するであろう、私はループのためにこのような大きなを使用しています100回

func someFunction() { 
    for keys in keysArray { 
     loadDataFromFirebaseWithKey(completionHandler: { (success, data) in 

      print(data) 

      // Task A Some length for loop 
      for i in 0...10000 { 
       print("A") 
      } 

      // Task B 
      for i in 10001...20000 { 
       print("B") 
      } 
     }) 

     // Task C 
     for i in 20001...30000 { 
      print("C") 
     } 

     // Task D 
     for i in 30001...40000 { 
      print("D") 
     } 
    } 
    // Task E 
    for i in 40001...50000 { 
     print("E") 
    } 

    // Task F 
    for i in 50001...60000 { 
     print("F") 
    } 
} 

理由はいくつかを説明するためにある実行されます。時間のかかる/非同期のプロセスです。ここで私は

  1. を思っていた3ケースプログラムは、タスクCを介して途中であれば、それはAとB

  2. セイを行うには、完了ブロックに入る前にCを終了し、また、Dんセイは、プログラムは、タスクEを通じて途中であれば、それはAを行うには、完了ブロックに入る前に、Eを終了し、また、Fず、B

+0

これらの結果が正しい場合は、すべて印刷しています。だから理想的には結果を見るべきです。 –

+0

この質問を投稿するのではなく、実際にテストを行ってみませんか?どのような結果が得られますか?結果に基づいて、その結果を理解できない場合は、質問が更新され、結果が期待どおりに異なる理由が尋ねられます。 – rmaddy

+0

"あなたはそれを試しましたか?"私たちが並行性について話しているときには、経験的な証拠が決定的であるべきであると助言することには注意が必要です。それは契約上の保証です。あなたが開発中に1万人の競合状態に遭うかどうかは関係ありません。 – Tommy

答えて

0

タスクを同時に実行している場合は、それらを有効なものとしてお互いを置き換えること機会を得て、純粋なconcurrenc 4世代以来のすべてのiOSデバイスが複数のコアを持っていることを考えると、中断時に特定の時点にループが発生する理由はありません。

Firebaseがその完了ハンドラをシリアルキュー上でスケジューリングする場合、どのハンドラも他のハンドラと重複しません。

メインキューの完了ハンドラをスケジューリングし、メインキューから呼び出した場合、完了ハンドラも呼び出しコードも重複しません。

ので、直接お答えします

  1. はいあなたはから呼び出されて、そのキューがシリアルであるとFirebaseが同じキューに完了ハンドラをスケジュールされている場合 - ほとんど常にすべてがメインキューがある場合は「はい」を意味していますリンクされた。そうでなければいいえ。

  2. 同じ回答です。 forループには特別な並行処理の魔法はありません。それらは他のコードとまったく同じように奪い取ることができます。

+0

ありがとうTommy。あなたとRobの並行性に関する大きな説明 – user125972

関連する問題