적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] url 이용하여 image 받아오기

hongssup_ 2021. 6. 24. 15:40
반응형

1. UIImageView에 extension으로 메서드 추가하는 방법

url로 이미지 불러오는 일이 이렇게 복잡한 지 처음 알았다... 

그냥 대충 setImage에 url 인자 넣으면 되는 줄 알았더니 생각보다 아주 까다롭구만..

 

다음과 같이 UIImageView에 extension으로 url로 이미지 로드하는 메서드를 만들어준다. 

이미지를 다운로드받아 불러올 때, 이미지가 클 경우 시간이 오래 걸릴 수 있기에 끊김이 없도록 DispatchQueue를 사용해 멀티쓰레드로 처리를 해준다. 

extension UIImageView {
    func load(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
                    }
                }
            }
        }
    }
}

뷰컨트롤러 안에서 직접 받아와도 되지만,

이렇게 extension으로 만들어주면 원할 때 어디서든 load 메서드를 이용하여 이미지를 간편하게 받아올 수 있다. 

다음과 같이 편하게 사용가능함. 

var image: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "url")
    image.load(url: url!)
}

 

 

참고 :

https://www.youtube.com/watch?v=j-IvjFtECD0

 


2022-08-31

2. KingFisher 라이브러리 사용하는 방법

KingFisher라는 오픈소스 라이브러리를 사용하여 이미지를 간편하게 관리할 수도 있다. 

if let imageURL = URL(string: imageURL) {
    imageView.kf.setImage(with: url)
}

 


2023-03

3. async / await + URLSession 사용하는 방법

func fetchImage(url: URL) async throws -> UIImage {
    let request = URLRequest(url: url)
    let (data, response) = try await URLSession.shared.data(for: request)
        
    guard let statusCode = (response as? HTTPURLResponse)?.statusCode,
              (200...299).contains(statusCode) else { throw NSError(domain: "fetch error", code: 1004) }
    guard let image = UIImage(data: data) else { NSError(domain: "image coverting error", code: 999) }

    return image
}

위 처럼 이미지를 받아와서 아래과 같이 사용할 수 있다. 

let image = try await fetchImage(url: url)
728x90
반응형