19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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内で更新している。

19
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
19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?