こう使えるようになる
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
内で更新している。