์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

DispatchQueue.global().async์™€ DispatchQueue.main.async

๐ŸŽ iOS/Network

by AHN.Jihyeon 2024. 8. 3. 11:01

๋ณธ๋ฌธ

import UIKit

//์ปฌ๋ ‰์…˜ ๋ทฐ์˜ ์…€์— ํ•ด๋‹น
class PosterCell: UICollectionViewCell {
    static let id = "PosterCell"
    
    //์…€์— ์ด๋ฏธ์ง€๋ฅผ ๋„์›Œ์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ
    let imageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        imageView.backgroundColor = .darkGray
        imageView.layer.cornerRadius = 8
        return imageView
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        contentView.addSubview(imageView)
        imageView.frame = contentView.bounds //imageView์˜ frame ํฌ๊ธฐ๋ฅผ contentView์™€ ๋˜‘๊ฐ™์ด
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    
    func configure(with movie: Movie){
        guard let posterPath = movie.posterPath else {return}
        let urlString = "https://image.tmdb.org/t/p/w500/\(posterPath).jpg"
        guard let url = URL(string: urlString) else {return}
        
        // ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ˆ˜ํ–‰ -> ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ์—์„œ URL์˜ ๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€)๋ฅผ ๋‹ค์šด๋กœ๋“œ
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url){ // URL์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
                DispatchQueue.main.async {  // ๋ฉ”์ธ ํ์—์„œ UI ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰
                    if let image = UIImage(data: data) {
                        self?.imageView.image = image  // ์ด๋ฏธ์ง€ ๋ทฐ์— ์ด๋ฏธ์ง€ ์„ค์ •
                    }
                }
            }
            
        }
    }
    
}

 

 

 

DispatchQueue.global().async

DispatchQueue.global()์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

๋„คํŠธ์›Œํฌ ์š”์ฒญ: ๋„คํŠธ์›Œํฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ž‘์—…์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด ์ž‘์—…์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์•ฑ์˜ UI๊ฐ€ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: async๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ด ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰.

 

 

 

DispatchQueue.main.async

DispatchQueue.main์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” UI ์—…๋ฐ์ดํŠธ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ์ด๋‹ค.

 

UI ์—…๋ฐ์ดํŠธ: iOS์—์„œ๋Š” UI ๊ด€๋ จ ์ž‘์—…์€ ๋ฐ˜๋“œ์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„, imageView์˜ ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•˜๋Š” ์ž‘์—…์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

์•ˆ์ „์„ฑ: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ UI๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด DispatchQueue.main.async๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ