[Swift🦩] #18 λ™μ‹œμ„± ⭐️⭐️

λ˜μƒΒ·2022λ…„ 4μ›” 5일
0

iOS

λͺ©λ‘ 보기
31/42
post-thumbnail

μš©μ–΄ 정리

  • blocking : ν•¨μˆ˜ 호좜 μ‹œ, κΈ°λŒ€λ˜λŠ” ν–‰μœ„λ₯Ό λͺ¨λ‘ 끝마칠 λ•Œ κΉŒμ§€ κΈ°λ‹€λ Έλ‹€κ°€ λ¦¬ν„΄λ˜λ©΄, 'λΈ”λ‘œν‚Ήλ˜μ—ˆλ‹€'.
  • non-blocking : λ°˜λŒ€λ‘œ, κΈ°λŒ€λ˜λŠ” ν–‰μœ„λ₯Ό μš”μ²­λ§Œ ν•˜κ³  λ°”λ‘œ λ¦¬ν„΄λ˜λ©΄ 'λ…ΌλΈ”λ‘œν‚Ήλ˜μ—ˆλ‹€'.
  • 동기 : 순차적으둜 μž‘λ™.
  • 비동기 : μˆœμ°¨μ μ΄μ§€ μ•Šλ‹€. λ™μ‹œμ— μ‹€ν–‰λ˜κ³  μžˆλ‹€.

Concurrency

  • SwiftλŠ” 비동기 / 병렬 μ½”λ“œ μž‘μ„±μ„ μ§€μ›ν•œλ‹€.
  • 비동기(asynchronous) μ½”λ“œ : μΌμ‹œμ μœΌλ‘œ 쀑단될 수 있고, ν•œλ²ˆμ— ν”„λ‘œκ·Έλž¨μ˜ ν•œ λΆ€λΆ„λ§Œ μ‹€ν–‰
  • 병렬(parallel) μ½”λ“œ : λ™μ‹œμ— μ½”λ“œμ˜ μ—¬λŸ¬ 뢀뢄이 싀행됨.

λ™μ‹œμ„± = 비동기 + 병렬

비동기 ν•¨μˆ˜ 호좜 ν”„λ‘œμ„ΈμŠ€

1. await 둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, ν•¨μˆ˜λŠ” ν•΄λ‹Ή μŠ€λ ˆλ“œμ˜ μ œμ–΄κΆŒμ„ ν¬κΈ°ν•˜κ²Œ λœλ‹€.
2. async μž‘μ—… & 같은 블둝 ν•˜λ‹¨μ˜ μ½”λ“œλ“€μ„ μŠ€λ ˆλ“œλ₯Ό μž‘μ•„μ„œ λ°”λ‘œ μ‹€ν–‰ν•  수 μ—†κ²Œ 됨.
3. μŠ€λ ˆλ“œ μ œμ–΄κΆŒμ€? μ‹œμŠ€ν…œμ—κ²Œ! κ·ΈλŸ¬λ―€λ‘œ await 된 async μž‘μ—…λ„ μŠ€μΌ€μ₯΄ ν•˜λΌκ³  μ‹œμŠ€ν…œμ—κ²Œ 뢀탁.
4. μ‹œμŠ€ν…œ : μš°μ„ μˆœμœ„μ— 따라 async 말고 λ‹€λ₯Έ μž‘μ—…μ„ λ¨Όμ € 진행할 수 있음. (ν•΄λ‹Ή μŠ€λ ˆλ“œμ—μ„œ)
5. async μž‘μ—…μ˜ μˆœμ„œκ°€ 였면, μ‹œμŠ€ν…œμ€ await ν•˜κ³  있던 μž‘μ—…μ„ μž¬κ°œν•˜κ²Œ ν•˜κ³ , μ–΄λ–€ νŠΉμ •ν•œ μŠ€λ ˆλ“œ μ œμ–΄κΆŒμ„ μ£Όλ©΄μ„œ 미뀄진 async μž‘μ—…μ΄ μ‹€ν–‰λœλ‹€. (μ‹€ν–‰λ˜λŠ” μŠ€λ ˆλ“œλŠ” 기닀리기 μ „μ˜ μŠ€λ ˆλ“œμ™€ λ‹€λ₯Ό 수 있음)
/
좜처 - https://sujinnaljin.medium.com/swift-async-await-concurrency-bd7bcf34e26f

λ™μ‹œμ„± μ½”λ“œ 없이도 비동기 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆμ§€λ§Œ, 쀑첩 ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•΄μ„œ 가독성이 떨어지고 μ—λŸ¬ 상황에 λŒ€μ‘ν•  수 μ—†λŠ” κ²½μš°κ°€ μžˆμ—ˆκΈ° λ•Œλ¬Έμ—, μƒˆλ‘œ λ™μ‹œμ„± κ°œλ…μ„ λ„μž…!

listPhotos(inGallery: "Summer Vacation") { photoNames in
    let sortedNames = photoNames.sorted()
    let name = sortedNames[0]
    downloadPhoto(named: name) { photo in
        show(photo)
    }
}



1. 비동기 ν•¨μˆ˜ μ •μ˜μ™€ 호좜

  • 비동기 ν•¨μˆ˜(λ©”μ„œλ“œ) λŠ” μ‹€ν–‰ 도쀑에 μΌμ‹œμ μœΌλ‘œ 쀑단될 수 μžˆλŠ” νŠΉμˆ˜ν•œ ν•¨μˆ˜
  • ν•¨μˆ˜κ°€ λ°˜ν™˜λ  λ•Œ κΉŒμ§€ μž‘μ—…μ„ μž μ‹œ 멈좜 수 μžˆλ‹€. (block)
    • 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ λ“€μ–΄κ°€λ©΄μ„œ μž μ‹œ λ©ˆμΆ°λ†“κ³ , 같은 ν”„λ‘œκ·Έλž¨ λ‚΄μ˜ λ‹€λ₯Έ 것이 λ™μž‘ν•  수 있게 함.
  • <-> 일반적인 동기 ν•¨μˆ˜
    • μ™„λ£Œλ  λ•ŒκΉŒμ§€ μ‹€ν–‰λ˜κ±°λ‚˜
    • 쀑간에 였λ₯˜ λ°œμƒ

  • 비동기 ν•¨μˆ˜μž„μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ async ν‚€μ›Œλ“œ μ‚¬μš©.
  • λ§Œμ•½ async ν•¨μˆ˜κ°€ throw 도 ν•˜λ©΄ async throws μˆœμ„œλ‘œ μž‘μ„±.
  • μ‹€μ œλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λΆ€λΆ„μ—μ„œλŠ” try await λ₯Ό μ‚¬μš©.
func listPhotos(inGallery name: String) async -> [String] {
    let result = // ... some asynchronous networking code ...
    return result
}

비동기 ν•¨μˆ˜ μ‹€ν–‰ 흐름

  • 비동기 λ©”μ„œλ“œ λ‚΄μ—μ„œ μ‹€ν–‰ 흐름은, λ‹€λ₯Έ 비동기 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œλ§Œ μΌμ‹œ μ€‘λ‹¨λœλ‹€.
  • 쀑단은 μ•”μ‹œμ μœΌλ‘œ 이루어지지 μ•ŠμœΌλ―€λ‘œ, 무쑰건 await ν‚€μ›Œλ“œλ‘œ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰ν•œλ‹€κ³  ν‘œμ‹œν•΄μ•Ό ν•œλ‹€.
    • async ν•¨μˆ˜κ°€ return 되기λ₯Ό κΈ°λ‹€λ¦¬λ©΄μ„œ ν˜„μž¬ μ½”λ“œ 뢀뢄이 싀행을 μΌμ‹œ 쀑단 ν•  수 μžˆλ‹€.
    • ν•΄λ‹Ή μ“°λ ˆλ“œλ₯Ό λ‹€λ₯Έ μ½”λ“œμ— λ„˜κ²¨μ£ΌκΈ° λ•Œλ¬Έμ—, μ“°λ ˆλ“œ 양보라고 λΆ€λ₯Έλ‹€.
let photoNames = await listPhotos(inGallery: "Summer Vacation")
let sortedNames = photoNames.sorted()
let name = sortedNames[0]
let photo = await downloadPhoto(named: name)
show(photo)

  • await ν•¨μˆ˜λŠ” 싀행을 μΌμ‹œ 쀑단할 수 μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ • μœ„μΉ˜μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.
    • 비동기 ν•¨μˆ˜, λ©”μ„œλ“œ λ˜λŠ” ν”„λ‘œνΌν‹°μ˜ 바디에 μžˆλŠ” μ½”λ“œ
    • @main 으둜 ν‘œμ‹œλœ ꡬ쑰체, 클래슀, μ—΄κ±°ν˜•μ˜ static λ©”μ„œλ“œμ— μžˆλŠ” μ½”λ“œ
    • κ΅¬μ‘°ν™”λ˜μ§€ μ•Šμ€ ν•˜μœ„ μž‘μ—… μ½”λ“œ



2. 비동기 μ‹œν€€μŠ€

  • listPhotos 의 경우, 사진 λ°°μ—΄ 전체가 μ€€λΉ„λœ λ‹€μŒμ— 전체 배열을 ν•œλ²ˆμ— λ°˜ν™˜λμ§€λ§Œ,
func listPhotos(inGallery name: String) async -> [String] {
    let result = // ... some asynchronous networking code ...
    return result
}
  • for await in ꡬ문으둜 λ°°μ—΄ μ•„μ΄ν…œ ν•˜λ‚˜ν•˜λ‚˜λ₯Ό λΉ„λ™κΈ°λ‘œ 뢈러올 μˆ˜λ„ μžˆλ‹€.
import Foundation

let handle = FileHandle.standardInput
for try await line in handle.bytes.lines {
    print(line)
}



3. 비동기 ν•¨μˆ˜ λ³‘λ ¬λ‘œ 호좜

  • await 둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, μ½”λ“œμ˜ ν•œ λΆ€λΆ„λ§Œ 싀행됨.
  • κ·Έλž˜μ„œ λ‹€μŒ 라인을 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ κΈ°λ‹€λ €μ•Ό 함.

await ν‚€μ›Œλ“œκ°€ λΆ™μ–΄μžˆμ–΄μ„œ

  • download firstPhoto
  • download secondPhoto
  • download thirdPhoto
  • λ₯Ό μ „λΆ€ ν•΄μ•Όλ§Œ let photos = ~~
// a
let firstPhoto = await downloadPhoto(named: photoNames[0])
let secondPhoto = await downloadPhoto(named: photoNames[1])
let thirdPhoto = await downloadPhoto(named: photoNames[2])

let photos = [firstPhoto, secondPhoto, thirdPhoto]
show(photos)

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ async let ν•œλ‹€λ©΄?

  • 비동기 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μ£Όλ³€μ˜ μ½”λ“œμ™€ λ³‘λ ¬μ μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλ‹€.
// async ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄, λ™μ‹œμ— 3μž₯ λ°›μ•„μ˜¬ 수 있음.
// 이전 호좜이 μ™„λ£Œλ˜κΈΈ 기닀리지 μ•Šκ³  μ‹œμž‘ν•¨.
async let firstPhoto = downloadPhoto(named: photoNames[0])
async let secondPhoto = downloadPhoto(named: photoNames[1])
async let thirdPhoto = downloadPhoto(named: photoNames[2])

// λŒ€μ‹  이 λ¬Έμž₯은 사진 3μž₯을 μ „λΆ€ 받을 λ•Œ κΉŒμ§€ κΈ°λ‹€λ Έλ‹€ μ‹€ν–‰ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— await λ₯Ό λΆ™μ—¬μ•Ό 함.
let photos = await [firstPhoto, secondPhoto, thirdPhoto]
show(photos)

  • 순차적으둜 μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” μž‘μ—… (이전 κ²°κ³Όλ₯Ό λ‹€μ‹œ κ°–λ‹€ μ“΄λ‹€λ˜μ§€) -> await ν‚€μ›Œλ“œλ₯Ό λ„£μ–΄μ„œ 호좜
  • λ”±νžˆ λ‚˜μ€‘μ— κ²°κ³Όκ°€ ν•„μš”ν•˜μ§€ μ•ŠμŒ -> async let



4. μž‘μ—…κ³Ό μž‘μ—… κ·Έλ£Ή Task

Task : μ½”λ“œλ₯Ό λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜λŠ” κΈ°λ³Έ λ©”μ»€λ‹ˆμ¦˜

  • Task : λΉ„λ™κΈ°μ μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μž‘μ—… λ‹¨μœ„
  • 비동기 μ½”λ“œλŠ” μ–΄λ–€ μž‘μ—…μ˜ μΌλΆ€λ‘œ μ‹€ν–‰λœλ‹€.
  • 예λ₯Ό λ“€μ–΄, μœ„μ˜ async - let ꡬ문의 경우 μž‘μ—… 3개둜 이루어져 μžˆλ‹€.
  • Task Group 을 λ§Œλ“€μ–΄μ„œ ν•˜μœ„ μž‘μ—…μ„ μΆ”κ°€ν•˜λŠ” ν˜•μ‹μœΌλ‘œ, μš°μ„ μˆœμœ„/μ·¨μ†Œ μ œμ–΄, λ™μ μœΌλ‘œ μž‘μ—… 생성 κ°€λŠ₯.
  • μž‘μ—… κ·Έλ£Ή λ‚΄μ˜ μž‘μ—…μ—λŠ” λ™μΌν•œ μƒμœ„ μž‘μ—…μ΄ 있으며, ν•˜μœ„ μž‘μ—…μ€ μžˆμ„ μˆ˜λ„ 없을 μˆ˜λ„ μžˆλ‹€.
  • μž‘μ—…κ³Ό μž‘μ—… κ·Έλ£Ή κ°„μ˜ λͺ…μ‹œμ μΈ 관계가 μžˆμ–΄μ„œ ꡬ쑰적 λ™μ‹œμ„±(Structured Concurrency) μ ‘κ·Ό 방식이라고 뢈림.
  • 정확성에 λŒ€ν•œ 일뢀 μ±…μž„μ„ 지고 μžˆμ–΄μ„œ, λΆ€λͺ¨-μžμ‹ 관계λ₯Ό 톡해 μ·¨μ†Œ μ „νŒŒ 같은 일뢀 λ™μž‘κ³Ό, 컴파일 ν•˜λŠ” λ™μ•ˆμ˜ 일뢀 였λ₯˜λ₯Ό 감지할 수 μžˆλ‹€.

Unstructured Concurrency

  • TaskGroup 같은 ꡬ쑰화 된 μ ‘κ·Ό 방식 이외에도 λ™μ‹œμ„±μ— λŒ€ν•œ μ ‘κ·Ό 방식이 μžˆλ‹€.
  • μƒμœ„ μž‘μ—…μ΄ μ—†μ–΄μ„œ μ™„μ „ν•œ μœ μ—°μ„±μ„ κ°€μ§€μ§€λ§Œ, 정확성에 λŒ€ν•œ μ±…μž„μ΄ μ‚¬μš©μžμ—κ²Œ μžˆλ‹€.
  • Task.init(priority: operation:) ꡬ문을 μ‚¬μš©ν•΄μ„œ ν˜„μž¬ ν–‰μœ„μžμ—μ„œ μ‹€ν–‰λ˜λŠ” ꡬ쑰화 λ˜μ§€ μ•Šμ€ μž‘μ—…μ„ 생성할 수 μžˆλ‹€.
  • Task.detached(priority: operation:) ꡬ문을 μ‚¬μš©ν•˜λ©΄, ν˜„μž¬ ν–‰μœ„μžμ˜ 일뢀가 μ•„λ‹Œ κ΅¬μ‘°ν™”λ˜μ§€ μ•Šμ€ μž‘μ—…μ„ 생성할 수 μžˆλ‹€.
  • μž‘μ—…κ³Ό μƒν˜Έμž‘μš©ν•  수 μžˆλŠ” ν•Έλ“€λŸ¬λ₯Ό λ°˜ν™˜ν•œλ‹€.
let newPhoto = // ... some photo data ...
let handle = Task {
    return await add(newPhoto, toGalleryNamed: "Spring Adventures")
}
let result = await handle.value

μž‘μ—… μ·¨μ†Œ

  • Cooperative Cancellation Model ν˜‘λ™ μ·¨μ†Œ λͺ¨λΈμ„ 톡해,
  • μž‘μ—…μ΄ 싀행이 μ μ ˆν•œ μ‹œμ μ—μ„œ μ·¨μ†Œλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³ , μ·¨μ†Œμ— μ‘λ‹΅ν•œλ‹€.
  • μž‘μ—… μ·¨μ†Œμ˜ μ’…λ₯˜
    • CancellationError 와 같은 μ—λŸ¬ λ°œμƒ
    • nil λ˜λŠ” 빈 μ½œλ ‰μ…˜ λ°˜ν™˜
    • λΆ€λΆ„μ μœΌλ‘œ μ™„λ£Œλœ μž‘μ—… λ°˜ν™˜
  • Task.checkCancellation() 을 톡해 CancellationError κ°€ λ°œμƒν•œ μˆœκ°„μ„ μž‘μ•„μ„œ μ²˜λ¦¬ν•  수 있음.
  • Task.isCancelled 의 값을 ν™•μΈν•˜κ³  μ½”λ“œ λ‚΄μ—μ„œ μ²˜λ¦¬ν•  수 있음.
  • μˆ˜λ™μœΌλ‘œ μ·¨μ†Œν•˜λ €λ©΄ Task.cancel() 호좜.



5. ν–‰μœ„μž Actors

  • ν–‰μœ„μžλŠ” μ°Έμ‘° νƒ€μž…
  • ν΄λž˜μŠ€μ™€μ˜ 차이점
    • ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ ν–‰μœ„μž λ‚΄μ˜ ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
    • μ—¬λŸ¬ μž‘μ—… μ½”λ“œκ°€ 같은 ν–‰μœ„μž μΈμŠ€ν„΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•΄λ„ μ•ˆμ „ν•˜λ‹€.
    • mutable state 에 μ•ˆμ „ν•˜κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€.

μ˜ˆμ‹œ.

  • 클래슀, ꡬ쑰체 문법과 거의 μœ μ‚¬ν•˜μ§€λ§Œ,
  • actor λ°”κΉ₯μ—μ„œ actor μ•ˆμ˜ ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ— μ ‘κ·Όν•  λ•Œ,
    • ν•˜λ‚˜μ˜ task 만 ν•΄λ‹Ή μ½”λ“œμ— μ ‘κ·Όν•  수 μžˆμœΌλ―€λ‘œ,
    • λ‹€λ₯Έ task κ°€ μ ‘κ·Όν–ˆμ„ λ•Œ λ©ˆμΆ°λ†”μ•Όν•¨.
    • await ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ ν˜ΈμΆœν•œλ‹€.
  • ν–‰μœ„μž μ•ˆμ—μ„œλŠ” ν”„λ‘œνΌν‹°λ‚˜ λ©”μ„œλ“œμ— μ ‘κ·Όν•  λ•Œ, await λ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. (actor isolation)
// actor ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ ν–‰μœ„μžλ₯Ό λ„μž…ν•˜κ³ , μ€‘κ΄„ν˜Έλ‘œ μ •μ˜.
actor TemperatureLogger {
    let label: String
    var measurements: [Int]
    private(set) var max: Int

    init(label: String, measurement: Int) {
        self.label = label
        self.measurements = [measurement]
        self.max = measurement
    }
}

extension TemperatureLogger {
    // ν–‰μœ„μž μ•ˆμ—μ„œ μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ, await λ₯Ό 쓰지 μ•ŠλŠ”λ‹€.
    // μ—¬λŸ¬ μž‘μ—…μ—μ„œ λ™μ‹œμ— 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 경우, 
    // ν–‰μœ„μž λ‚΄ ν”„λ‘œνΌν‹°μ˜ λΆˆλ³€μ„±μ΄ κΉ¨μ§€λ―€λ‘œ
    // ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μ²˜λ¦¬ν•  수 있게 λ§Œλ“œλŠ” ν–‰μœ„μžλ₯Ό μ‚¬μš©ν•œλ‹€.
    func update(with measurement: Int) {
        measurements.append(measurement)
        if measurement > max {
            max = measurement
        }
    }
}

let logger = TemperatureLogger(label: "Outdoors", measurement: 25)
print(await logger.max) 
// λ‹€λ₯Έ μž‘μ—…μ˜ μ½”λ“œκ°€ 이미 μƒν˜Έμž‘μš©ν•˜κ³  있으면 접근을 κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ μΌμ‹œμ •μ§€.
// await λ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ©΄ μ—λŸ¬λ₯Ό λΏœλŠ”λ‹€.
// Prints "25"



정리

async await

  • async ν‚€μ›Œλ“œλ₯Ό 톡해 μ›λž˜ non-blocking 인 Swift 의 ν•¨μˆ˜λ₯Ό blocking 으둜 λ§Œλ“€μ–΄ μ£ΌλŠ” 것.
  • await ν‚€μ›Œλ“œλ₯Ό 톡해 blocking ν•¨μˆ˜κ°€ λλ‚ λ•Œ κΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” 것 (동기)
  • escaping closure λ₯Ό μ‚¬μš©ν•΄μ„œ non-block / 비동기 둜 μ‚¬μš©ν•˜λ˜ 것을 block / 동기인 κ²ƒμ²˜λŸΌ μ‚¬μš©.
  • async ν•¨μˆ˜, await ν‚€μ›Œλ“œλ‘œ 호좜 -> μŠ€λ ˆλ“œ μ œμ–΄κΆŒ μ‹œμŠ€ν…œμ— κ°€λ©΄μ„œ λŒ€κΈ° -> μ‹œμŠ€ν…œμ΄ μš°μ„ μˆœμœ„μ— 따라 μž‘μ—… -> μ°¨λ‘€κ°€ λŒμ•„μ™€μ„œ μ‹œμŠ€ν…œμ΄ ν•΄λ‹Ή μž‘μ—…μ— μ–΄λ–€ μŠ€λ ˆλ“œλ₯Ό μ£Όλ©΄ κ±°κΈ°μ—μ„œ μ‹€ν–‰.
    /
  • Task : 비동기 μž‘μ—…μ˜ λ‹¨μœ„. μš°μ„ μˆœμœ„λ‚˜ μ·¨μ†Œλ₯Ό μ œμ–΄ν•˜κ³  동적 생성 κ°€λŠ₯.
  • Actor : ν•˜λ‚˜μ˜ task 만 mutable state에 μ ‘κ·Όν•  수 있게 ν•˜μ—¬, μ•ˆμ „μ„± 확보.



좜처

https://bbiguduk.gitbook.io/swift/language-guide-1/concurrency
https://okky.kr/article/442803
https://sujinnaljin.medium.com/swift-async-await-concurrency-bd7bcf34e26f

profile
0λ…„μ°¨ iOS κ°œλ°œμžμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€