2016-08-02 3 views
0

私はイメージにイメージを表示するためにこのメソッドを使用していますが、ディスパッチメソッドに入るとインデックスが増加しています。 私が1のときは2に設定されます。 問題点を教えてください。グランドディスパッチを使用しているときに私のforループのインデックスが増加する理由

ありがとうございました。

for var i = 0 ; i<featuredCards.count ; i++ { 

    print("INDEXxxxxxxxxxxxx",i) 
    if i >= self.cardFeatruedTitlesCollection.count { 
     break 
    } 

    if photoModel.photoURL == featuredCards[i].cardPreviewImages[safe:0]?.photoURL { 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

     if let path = photoModel.photoPath { 

      if let image : UIImage = photoModel.getThumbnailPhotoWithPath(path) { 

       if let imageView = self.cardFeaturedImagesCollection[safe:i] { 
        imageView.image = image 
       } 

      } 
     } 
     }) 
    } 
} 
+1

あなたは運命のピラミッドがかなりあります。ステートメントごとに 'guard'ステートメントと複数の' if let'バインディングを読んでください。 – Alexander

答えて

3

あなたはディスパッチブロックは、それがインクリメント値を取得している理由thatsのループ反復の完了後に実行されるように、良いアイデアではありませんループでメインキューにアクセスしています。

この

dispatch_async(dispatch_get_main_queue()) { 

    for var i = 0 ; i<featuredCards.count ; i++ { 

     print("INDEXxxxxxxxxxxxx",i) 
     if i >= self.cardFeatruedTitlesCollection.count { 
      break 
     } 

     if photoModel.photoURL == featuredCards[i].cardPreviewImages[safe:0]?.photoURL { 


      if let path = photoModel.photoPath { 

       if let image : UIImage = photoModel.getThumbnailPhotoWithPath(path) { 

        if let imageView = self.cardFeaturedImagesCollection[safe:i] { 
         imageView.image = image 
        } 

       } 
      } 
     } 
    } 
} 

EDITしてみてください:

次の2つの方法のように、以下のmainqueueブロック内のループのためにあなたの

  1. 使用__block変数
  2. 場所でそれを解決することができます:swift 3を使用している場合は、次の構文を使用する必要があります。

    DispatchQueue.main.async { 
        //Your For Loop 
    } 
    
+0

ありがとうございます。 –

+0

変数iに__を追加する必要がありますか? –

+0

__block変数を使用することはオプションですが、良い考えではありません –

0

あなたがdispatch_asyncを使用して、メインキューに作業のブロックをキュー、制御が戻り、すぐに、あなたが実行する(キューイングされてきた作品の前にiを進み、刻み呼び出しサイト(ここでは、ループ)、へ期待していたiの値を読み取ります)。

var i : Intの値は、ループとディスパッチしているコードのクロージャの間で共有状態です。これは競合状態につながります。iがキューに入れられた作業によって読み取られる前にループがiを変更することがあります。

ループ内で定数コピーiを使用すると、共有状態の量を減らすことができます。

let photoIndex = i 

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
if let path = photoModel.photoPath { 
    if let image : UIImage = photoModel.getThumbnailPhotoWithPath(path) { 
     if let imageView = self.cardFeaturedImagesCollection[safe: photoIndex] { 
      imageView.image = image 
     } 

    } 
} 
関連する問題