将图像从URL加载到表格视图单元格中的图像视图的更快方法

Utk*_*maz 8 xcode ios swift

我用它来加载URL到图像视图

let url = NSURL(string: URL)
let data = NSData(contentsOfURL: url!)
self.releasephoto.image  = UIImage(data: data!)
Run Code Online (Sandbox Code Playgroud)

但是当表视图单元格中有10个项目具有不同的图像时,滚动会变慢并挂起

我加载大小为40 X 40的图像

我想知道是否有更好的方法来加载URL图像?

Sam*_*Sam 21

我建议使用SDWebImage.

安装完成后,您需要为Swift创建一个桥接头并包含以下行:

#import "UIImageView+WebCache.h"
Run Code Online (Sandbox Code Playgroud)

那么你需要在你的cellForRowAtIndexPath函数中做的就是:

let url = NSURL(string: URL)
self.releasephoto.sd_setImageWithURL(url)
Run Code Online (Sandbox Code Playgroud)

这个库的好处是它会自动缓存图像,所以它只下载一次.


mat*_*att 5

您必须异步加载视图.最初提供虚拟或空白图像.然后在后台异步加载到模型中,显示当前显示的单元格的任何图像.当每个图像到达时,将其存储在模型中并重新加载表视图.因此每个图像都会在它到达时出现,但是你的滚动不会因为总是一个图像而变慢- 如果你没有为这一行提取图像,则为空白或虚拟图像,如果你已经提取了图像,则为真实图像它.

这是我书中的示例代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath:indexPath) as UITableViewCell
    let m = self.model[indexPath.row]
    cell.textLabel!.text = m.text
    // have we got a picture?
    if let im = m.im {
        cell.imageView!.image = im
    } else {
        if m.task == nil { // no task? start one!
            cell.imageView!.image = nil
            m.task = self.downloader.download(m.picurl) { // *
                [weak self] url in // *
                m.task == nil // *
                if url == nil {
                    return
                }
                let data = NSData(contentsOfURL: url)!
                let im = UIImage(data:data)
                m.im = im
                dispatch_async(dispatch_get_main_queue()) {
                    self!.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
                }
            }
        }
    }
    return cell
}
Run Code Online (Sandbox Code Playgroud)

(完整的工作示例就在这里.而MyDownloader的代码self.downloader在这里.)

为了获得额外的超级效率,如果用户在图像到达之前将一行拖出视图,请取消下载.这样,您可以设置一次可以进行多少次下载的上限.


Kal*_*esh 5

我已经在这里回答了类似的问题

使用以下类:

class ImageLoadingWithCache {

    var imageCache = [String:UIImage]()

    func getImage(url: String, imageView: UIImageView, defaultImage: String) {
        if let img = imageCache[url] {
            imageView.image = img
        } else {
            let request: NSURLRequest = NSURLRequest(URL: NSURL(string: url)!)
            let mainQueue = NSOperationQueue.mainQueue()

            NSURLConnection.sendAsynchronousRequest(request, queue: mainQueue, completionHandler: { (response, data, error) -> Void in
                if error == nil {
                    let image = UIImage(data: data)
                    self.imageCache[url] = image

                    dispatch_async(dispatch_get_main_queue(), {
                        imageView.image = image
                    })
                }
                else {
                    imageView.image = UIImage(named: defaultImage)
                }
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var cache = ImageLoadingWithCache()
cache.getImage(YOUR_URL, imageView: YOUR_IMAGEVIEW, defaultImage: "DEFAULT_IMAGE_NAME")
Run Code Online (Sandbox Code Playgroud)