在我的应用程序中,当我打开ViewController时,我必须下载近500张图像。一次下载所有500个图像不是一个正确的主意。我想一次保留5个活动的异步下载。当五人中的任何一人完成时,它应该从下一个开始。
我还有一个刷新控件,它将重新开始从最初下载所有图像。
我可以采用哪种技术来实现这种模式?
这是我到目前为止所尝试的,
信号量是在属性声明
中创建的private var semaphore = dispatch_semaphore_create(5)
获得Web服务响应后,
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)
})
})
}
但是当我点击刷新控件时,app锁定在dispatch_semaphore_wait
,我就能找到重置信号量的方法。
答案 0 :(得分:2)
我会像这样使用OperationQueue
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
})
}
}
您可以使用此
停止操作queue.cancelAllOperations();
然后重启整个事情。
您唯一需要改变的是您的请求必须是同步的。因为这种方法不适用于回调。