2016-09-21 7 views
0

私のアプリケーションでは、私はViewControllerを開いて約500枚のイメージをダウンロードする必要があります。一度に500枚の画像をすべてダウンロードするのは適切ではありません。一度に5つのアクティブな非同期ダウンロードを維持したいと思います。 5人に1人が完了すると、次の人が始まるはずです。iOSバルクイメージをダウンロードする最も良い方法

また、最初からすべてのイメージをダウンロードし直すようにリフレッシュコントロールがあります。

私はこのモーダルを実装するためにどのような技術を使うことができますか?ここで

は、

セマフォは、Webサービスの応答を取得した後、プロパティ宣言

private var semaphore = dispatch_semaphore_create(5) 

に作成され、私がこれまで試したどの

private func startDownloadingImages() { 
     for place in places { 
      dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER) 
      self.downloadImageForPlace(place) 
     } 
    } 

private func downloadImageForPlace(place: Place) { 
     ApplicationControls.getImageForPlace(place, withCompletion: { (image, error) ->() in 
      // error checks 
      dispatch_async(dispatch_get_main_queue(), { 
       // UI update 
       dispatch_semaphore_signal(self.semaphore) 
      }) 
     }) 
    } 

しかし、私はリフレッシュ制御をタップし、アプリですdispatch_semaphore_waitにロックして、セマフォをリセットする方法を見つけることができました。

答えて

1

私はあなたがこの

queue.cancelAllOperations(); 

であなたの業務を停止してから、ちょうど全体を再起動することができ、この

let queue = OperationQueue() 
queue.maxConcurrentOperationCount = 5; 

for url in imageUrls { 
    queue.addOperationWithBlock {() -> Void in 

     let img1 = Downloader.downloadImageWithURL(url) 

     NSOperationQueue.mainQueue().addOperationWithBlock({ 
      //display the image or whatever 
     }) 
    } 


} 

ようOperationQueueを使用します。

変更する必要があるのは、要求が同期している必要があることだけです。なぜなら、このアプローチはコールバックで動作しないからです。

+0

私もそれを試みました。どうしてか分かりません。 NSOperationQueueはプロパティmaxConcurrentOperationCountに従っていませんでした。 500回のダウンロードのすべてがforループ内にありました。 – iOS

+1

もちろん、それらはforループにありますが、操作キューは一度に5つ以上の操作を実行しません。 – ben

関連する問題