Completion์€ main์—์„œ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด์œ 

  • api๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ completion์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.
  • ๋„์ฐฉํ•œ ์‹œ์ ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋„ฃ์€ completion์„ ๊ทธ๋ƒฅ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•  ๋™์ž‘์ด ๋งŒ์•ฝ UI ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Š” ๋™์ž‘์ผ ๊ฒฝ์šฐ, main์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
private func test() {
    self.service.fetch { [weak self] data in
        DispatchQueue.main.async {
            self.updateUI(with data)
        }
    }
}
  • ๋‹น์žฅ์€ ๊ดœ์ฐฎ์ง€๋งŒ, ํ•ด๋‹น service๋ฅผ ์—ฌ๋Ÿฌ๊ณณ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๊ณณ์— DispatchQueue.main.async ๊ฐ€ ํ•„์š”ํ•ด์ง„๋‹ค.
  • app๊ณผ ๊ฐ™์€ ๊ณณ์—์„œ ๋‹ค๋ฅธ thread๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•  ๊ณณ์ด ์–ผ๋งˆ๋‚˜ ๋ ๊นŒ?
  • ๋ณดํ†ต์€ api ํ˜ธ์ถœ ํ›„ UI ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ๋ฐ˜์ ์ผ ๊ฒƒ์ด๋‹ค.
  • ๋ฐฑ์—”๋“œ์™€ ๊ฐ™์ด ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ž‘์—…์ด ์•„๋‹ˆ๋ผ๋ฉด, ๋‹น์žฅ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์˜ ๋ฐฉ์‹์— ๋งž์ถ”๋Š”๊ฒŒ ๋ณด๋‹ค ์ข‹๋‹ค.
  • ์ฆ‰, UI ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ์—๋Š” completion์„ api ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ main์—์„œ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์ฝ”๋“œ์˜ ์ง€์ €๋ถ„ํ•จ๊ณผ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
 
internal func fetch(completion: (data: String) -> Void) {
    // ๋ฐ์ดํ„ฐ ๋ฐ›์€ ํ›„,
 
    DispatchQueue.main.async {
        completion(data)
    }
}