비동기적으로 URL을 불러오지 않으면 이미지가 불러올 때까지 화면이 멈춰있을것이다.
그래서 비동기적으로 image를 불러와야한다. Library를 쓰면 아주 간단하지만 혹시라도 쓰기 힘든 상황일때 쓰기 좋게 Extension화해서 사용하면 된다.
extension UIImageView {
func imageFrom(url: URL) {
DispatchQueue.global().async { [weak self] in
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async {
self?.image = image
}
}
}
}
}
}
DispatchQueue를 사용해서 Thread 별로 Task를 동작하게 할 수 있다.
1. '.global'을 사용해서 우선순위대로 동시에 작업해주는데 여기서는 default를 사용해주면 된다.
2. '.main'을 사용해서 UI를 업데이트 해줌으로써 마무리 해준다.
실행해보면 이미지 이외의 부분은 표시되고 이미지는 로딩 속도에 따라 나타나게 된다.