UIImageView 通过 URL 异步加载图片

发布
更新
字数 177
阅读 1 分钟
阅读量 843

可以通过 Data(contentsOf:) 获取图片数据后再通过 UIImage(data:) 得到图片。

import UIKit
import PlaygroundSupport

extension UIImageView {
    func load(_ url: URL) {
        DispatchQueue.global(qos: .background).async {[weak self] in
            guard let data = try? Data(contentsOf: url) else { return }
            
            guard let image = UIImage(data: data) else { return }
            
            DispatchQueue.main.async {
                self?.image = image
            }
        }
    }
}

class ViewController:UIViewController{
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let imageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        imageView.backgroundColor = .black
        view.addSubview(imageView)
        
        imageView.load(URL(string: "https://swift.org/apple-touch-icon-180x180.png")!)
    }

}

PlaygroundPage.current.liveView = ViewController()

需要注意避免反复加载的问题,例如在 UITableView 滚动时,反复渲染一个 cell 就可能会产生冗余加载,可以通过缓存 url 的方式判断加载情况,或者使用队列。个人建议使用 KingFisher

参考: https://www.hackingwithswift.com/example-code/uikit/how-to-load-a-remote-image-url-into-uiimageview