iOS下载批量图片的最佳方式

时间:2016-09-21 12:56:54

标签: ios swift asynchronous

在我的应用程序中,当我打开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,我就能找到重置信号量的方法。

1 个答案:

答案 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();

然后重启整个事情。

您唯一需要改变的是您的请求必须是同步的。因为这种方法不适用于回调。