LoginSignup
20
15

More than 5 years have passed since last update.

[Swift4] URL指定した画像を非同期でUIImageViewにセットする、便利なExtension

Last updated at Posted at 2018-07-04

こう使えるようになる

let url: URL? = URL(string: "https://hogehoge")
sampleImageView.loadImageAsynchronously(url: url, defaultUIImage: fugafugaUIImage)

活躍する場面

例えば、サーバーから取得した画像URLをもとに、TableViewを構成する時
同期的にUIImageをセットしていては、カクカクの悲しいTableViewになってしまう。
そんな時、↓のようなextensionを使えば、滑らかなTableViewを取り戻し幸せになれる!

extension

// 指定URLから画像を読み込み、セットする
// defaultUIImageには、URLからの読込に失敗した時の画像を指定する
extension UIImageView {
    func loadImageAsynchronously(url: URL?, defaultUIImage: UIImage? = nil) -> Void {

        if url == nil {
            self.image = defaultUIImage
            return
        }

        DispatchQueue.global().async {
            do {
                let imageData: Data? = try Data(contentsOf: url!)
                DispatchQueue.main.async {
                    if let data = imageData {
                        self.image = UIImage(data: data)
                    } else {
                        self.image = defaultUIImage
                    }
                }
            }
            catch {
                DispatchQueue.main.async {
                    self.image = defaultUIImage
                }
            }
        }
    }
}

補足: Viewの更新はメインスレッドで行わなければいけない。ので、DispatchQueue.main.async内で更新している。

20
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
15