如何仅使用一个线程下载一批图像?

时间:2017-09-11 12:57:32

标签: ios swift multithreading

我正在处理的应用,它有许多表格视图,每个单元格都有一个图像。问题是每个图像都是使用网络请求和不同的线程完成的,因此应用程序最终使用许多线程来异步下载所有图像(在cellForRowAtIndex方法中),这会导致巨大的电池消耗。

有没有办法可以只使用一个线程下载它们,也许是一个接一个?有没有更好的方法来处理这个问题?

翠鸟框架怎么样?

2 个答案:

答案 0 :(得分:3)

您可以将网络操作块分配到NSOperationQueue并为maxConcurrentOperationCount设置较低的值。

答案 1 :(得分:0)

是的,实际上有一种方法,使用翠鸟 这是我的示例代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

                switch indexPath.section {
                case 0:
                    let cell = tableView.dequeueReusableCell(withIdentifier: "BannerCell", for: indexPath) as! BannerCell

                    cell.loading.stopAnimating()

                    let urlString = banners[indexPath.row].image ?? ""
                    let url = URL(string: urlString)
                    cell.bannerPic.kf.indicatorType = .activity
                    cell.bannerPic.kf.setImage(with: url, completionHandler: {
                        (image, error, cacheType, imageUrl) in
                        DispatchQueue.main.async {

                            if let image = image{
                                if !(self.loaded[indexPath] ?? false){
                                    let aspectRatio = image.size.height/image.size.width

                                    let imageHeight = self.view.frame.width*aspectRatio
                                    tableView.beginUpdates()
                                    self.rowHeights[indexPath.row] = imageHeight
                                    tableView.endUpdates()
                                    self.loaded[indexPath] = true
                                }
                            }

                        }
                    })
                    cell.selectionStyle = .none
                    return cell
    }