Post

UIKit - URL로 이미지 다운로드하고 표시하기

URLSession을 사용하여 HTTP 요청을 보내 이미지 바이너리 데이터를 다운로드 받은 후 UIImage로 변환하여 처리 가능함.

구현 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import UIKit

final class ViewController: UIViewController {
    
    // MARK: - 이미지 뷰
    private let imageView: UIImageView = {
        let view = UIImageView()
        
        view.backgroundColor = .gray
        
        view.translatesAutoresizingMaskIntoConstraints = false
        
        return view
    }()
    
    // MARK: - 다운로드 버튼
    private lazy var downloadButton: UIButton = {
        let btn = UIButton()
        
        btn.setTitle("다운로드", for: .normal)
        btn.backgroundColor = .black
        btn.setTitleColor(.white, for: .normal)
        btn.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
        
        btn.addTarget(self, action: #selector(downloadImage), for: .touchUpInside)
        
        btn.translatesAutoresizingMaskIntoConstraints = false
        
        return btn
    }()
    
    // iTunes API 응답값으로 받은 jpg URL
    private let urlStr: String = "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/ab/2e/3a/ab2e3a42-1c8b-9f3f-3d36-da74de7be595/886449538959.jpg/60x60bb.jpg"

    // MARK: - 화면 구성
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupImageView()
        setupDownloadButton()
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        imageView.layer.cornerRadius = imageView.frame.width / 2.0
        imageView.clipsToBounds = true
    }
    
    func setupImageView(){
        view.addSubview(imageView)
        
        NSLayoutConstraint.activate([
            imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            imageView.heightAnchor.constraint(equalToConstant: 200),
            imageView.widthAnchor.constraint(equalToConstant: 200)
        ])
    }
    
    func setupDownloadButton(){
        view.addSubview(downloadButton)
        
        NSLayoutConstraint.activate([
            downloadButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            downloadButton.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 30),
            downloadButton.heightAnchor.constraint(equalToConstant: 50),
            downloadButton.widthAnchor.constraint(equalToConstant: 130)
        ])
    }
    
    // MARK: - 이미지 다운로드
    @objc func downloadImage(){
        guard let url = URL(string: urlStr)
        else {
            return
        }
        
        // HTTP 요청
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard error == nil else {
                print(error!)
                return
            }
            
            guard let data = data else {
                print("데이터 nil")
                return
            }
            
            DispatchQueue.main.async {
                self.imageView.image = UIImage(data: data) // 응답값으로 받은 이미지 UIImage로 변환
            }
        }.resume()
    }
}

화면을 그리는 역할은 오직 메인 쓰레드에서만 가능하기 때문에 DispatchQueue를 통해 메인 쓰레드에 접근하여 화면을 다시 그리도록 처리함.

결과

image

This post is licensed under CC BY 4.0 by the author.