๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
iOS ๐ŸŽ/iOS

async/await, continuation, Actor

by yongmin.Lee 2023. 2. 1.

async/await

  1. ๊ธฐ์กด completion handler๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ์ด์Šˆ ์กด์žฌ
    1. ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ชจ๋“  case์—์„œ completion handler๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”๊ฐ€
    2. self property์—์„œ retain cycle์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ
    3. completion handler๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ํ˜ธ์ถœ๋˜๋Š”๊ฒฝ์šฐ ๋–จ์–ด์ง€๋Š” ๊ฐ€๋…์„ฑ, ์ฝœ๋ฐฑ์ง€์˜ฅ
  2. ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Swift์— ์ฝ”๋ฃจํ‹ด(coroutine) ๋ชจ๋ธ์„ ๋„์ž…
    1. Coroutine์€ ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋„์ค‘ ํŠน์ • ์‹œ์ ์— suspend(์ผ์‹œ์ •์ง€)ํ•  ์ˆ˜ ์žˆ๊ณ , resume(๋‹ค์‹œ ์žฌ๊ฐœ)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    2. ๋น„๋™๊ธฐํ•จ์ˆ˜(async/await)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋งˆ์น˜ ๋™๊ธฐ ์ฝ”๋“œ์ธ๊ฒƒ ์ฒ˜๋Ÿผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค
  3. async
    1. ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค
    2. ํ•จ์ˆ˜๋ฅผ async๋กœ ํ‘œ์‹œํ•˜๋ฉด ์ผ์‹œ ์ค‘๋‹จ(to suspend)ํ•˜๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.
    3. ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์„ ์ผ์‹œ ์ค‘๋‹จํ•˜๋ฉด, ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ˜ธ์ถœ์ž๋„ ์ผ์‹œ ์ค‘๋‹จ์ด ๋œ๋‹ค. → ํ˜ธ์ถœ์ž๋„ async ์ด์–ด์•ผํ•จ
  4. await
    1. async ํ‚ค์›Œ๋“œ๊ฐ€ ํ‘œ์‹œ๋œ ๋ฉ”์†Œ๋“œ๋‚˜ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. suspension point ์ž„์„ ๋‚˜ํƒ€๋ƒ„
    2. ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’ ํ˜น์€ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง„ ์ดํ›„, suspension point์—์„œ resume(์‹คํ–‰์„ ์žฌ๊ฐœ)ํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ผ์‹œ ์ค‘๋‹จ๋˜๋Š” ๋™์•ˆ ์“ฐ๋ ˆ๋“œ๋Š” ์ฐจ๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ์€ ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ์— ๋‹ค๋ฅธ ์ž‘์—…์„ ์ž์œ ๋กญ๊ฒŒ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. suspend → resume์˜ ๊ณผ์ •
    1. 1. await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด suspension point๋กœ ์ง€์ •ํ•˜๊ณ  ์ผ์‹œ์ •์ง€ (suspend)
    2. 2. ์Šค๋ ˆ๋“œ์˜ ์ œ์–ด๊ถŒ์„ ์‹œ์Šคํ…œ์—๊ฒŒ ๋„˜๊ฒจ์คŒ => ์Šค๋ ˆ๋“œ ์–‘๋ณด(yielding)
    3. 3. ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ
    4. 4. ์‹œ์Šคํ…œ์ด ๋‹ค์‹œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—๊ฒŒ ์Šค๋ ˆ๋“œ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์คŒ
    5. 5. suspension point์—์„œ ์ž‘์—… ์žฌ๊ฐœ (resume)
  6. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋Š” ์ •ํ•ด์ง„ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž‘์—…์ด ๋งŽ์•„์ง€๋ฉด ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ๋„ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜์–ด ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ด์Šˆ ์กด์žฌํ•˜์ง€๋งŒ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ suspend ๋˜๋Š” ๊ณผ์ •์—๋Š” ์ถ”๊ฐ€์ ์ธ ์Šค๋ ˆ๋“œ์˜ ์ƒ์„ฑ ์—†์ด ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ์ด ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ๋กœ ๋ฐฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด์™€ ๊ฐ™์€ ๋งฅ๋ฝ์œผ๋กœ resumeํ• ๋•Œ ๋ฐฐ์ •๋ฐ›๋Š” ์“ฐ๋ ˆ๋“œ๋Š” ์ด์ „๊ณผ ๊ฐ™์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค

 

continuation

  1. ๊ธฐ์กด์˜  completion handler closure๋ฅผ continuation์„ ํ™œ์šฉํ•˜์—ฌ async ์ฝ”๋“œ ๋ณ€๊ฒฝํ• ์ˆ˜ ์žˆ๋‹ค
  2. Swift Concurrency์— ๋„์ž…๋œ ์ฝ”๋ฃจํ‹ด์—์„œ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ stack๊ณผ heap์—์„œ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ heap์— suspension point์—์„œ ์‹คํ–‰ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๋“ค์„ ์ €์žฅ
  3. ํž™์— ์ €์žฅ๋œ ์ •๋ณด๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ resume์‹œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น๋˜๋”๋ผ๋„ ์ผ์‹œ์ •์ง€๋œ ํ•จ์ˆ˜์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•ด ์–ด๋””์„œ๋ถ€ํ„ฐ ์žฌ๊ฐœํ• ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  4. suspend ๋˜์—ˆ๋˜ ํ•จ์ˆ˜๊ฐ€ resume ๋˜๋ฉด, stack์˜ ์ตœ์ƒ๋‹จ frame์ด ํ•ด๋‹น ํ•จ์ˆ˜ frame์œผ๋กœ ๊ต์ฒด๋˜๊ณ  ์ด๋ฏธ heap์— ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด stack frame์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ต์ฒด๋งŒ์œผ๋กœ๋„ ๋™์ž‘
// ๊ธฐ์กด closure๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ
func request(completion: ((String) -> Void)) {
    completion("Hello")
}

func run() {
    request(completion: {
        print($0)
    })
}

// continuation์œผ๋กœ ๊ฐ์‹ธ async๋กœ ๋ณ€๊ฒฝํ• ์ˆ˜ ์žˆ๋‹ค
func requestAsync() async -> String {
    return await withCheckedContinuation { continuation in
        request(completion: {
            continuation.resume(returning: $0)
        })
    }
}

func run() {
    Task {
        let result = await requestAsync()
        print(result)
    }
}

 

Actor

  • Swift 5.5 ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ์ƒˆ๋กœ์šด ํƒ€์ž…
  • Class์™€ ๋น„์Šทํ•˜๊ฒŒ ํŠน์ˆ˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…
  • ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋™์‹œ์— ํ•˜๋‚˜์˜ Task์—์„œ๋งŒ ์ ‘๊ทผ์„ ๋ณด์žฅ
  • var๋กœ ์„ ์–ธ๋œ ๊ฐ€๋ณ€ํ˜• ํ”„๋กœํผํ‹ฐ๋Š” ์™ธ๋ถ€์—์„œ ์ˆ˜์ • ์‹œ์—๋Š” ์™ธ๋ถ€์™€ ๊ฒฉ๋ฆฌ๋˜๋Š” ๊ทœ์ œ๋ฅผ ๋ฐ›๋Š”๋‹ค
  • actor์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ await๋กœ ์ ‘๊ทผ

 

 
 
 

Next

Structured Concurrency  

 
 

 

 

์ฐธ๊ณ 

https://sujinnaljin.medium.com/swift-async-await-concurrency-bd7bcf34e26f

 

.