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

[WWDC21] Discover concurrency in SwiftUI

by Danna 2023. 5. 18.
728x90
728x90

๋ชฉ์ฐจ

  • Concurrent data models
  • SwiftUI and the main actor
  • New concurrency tools

ํ•ด๋‹น ์˜์ƒ์„ ๋ณด๊ธฐ์ „์— ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ WWDC ์˜์ƒ

  • Meet async/await in Swift
  • Explore structured concurrency in Swift

์˜ˆ์‹œ ์•ฑ ) ์šฐ์ฃผ ์ด๋ฏธ์ง€ ๋ชฉ๋ก๋“ค ๋ณด์—ฌ์ฃผ๊ณ  ์ €์žฅํ•˜๋Š” ์•ฑ


(์šฐ์ฃผ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์˜ค๋ ค๋ฉด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๋Š” ํฐ๊ทธ๋ฆผ์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค  ๐Ÿง)

Concurrent data models

  • ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋ธ SpacePhoto
  • ์ด๋ฏธ์ง€ ๋ฐฐ์—ด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋ธ Photos
    • ObservableObject ๋กœ ๋˜์–ด์žˆ์–ด @published ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ items ๊ฐ’์ด ๋ณ€๊ฒฝ์‹œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ SwiftUI View ์—…๋ฐ์ดํŠธ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€!
  • SwiftUI ์ฝ”๋“œ : ์šฐ์„  ํƒ€์ดํ‹€์„ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋Š” ์ƒํƒœ

how SwiftUI interacts with observable object

  • SwiftUI ๋ทฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ์ธ "run loop" ์— ๋Œ€ํ•ด ์šฐ์„  ์‚ดํŽด๋ณด์ž!
    • Swift 5.5 ์—์„œ๋Š” run loop ๋Š” Main actor ์—์„œ ์‹คํ–‰๋œ๋‹ค.
    • ๋Ÿฐ ๋ฃจํ”„๋Š” "์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ด๋ฒคํŠธ ์ˆ˜์‹  -> ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ -> SwiftUI ๋ทฐ๋ฅผ ํ™”๋ฉด์— ๋ Œ๋”๋ง" ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ , ์ด๋ฅผ "ticks of the run loop" ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

  • Run loop ๋ฅผ ๊ธธ๊ฒŒ ํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • items ๋Š” Published ์†์„ฑ์ธ์ ์— ์ฃผ๋ชฉ ๐Ÿง
    • objectWillChange ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ ์‚ฌ์ง„์„ items ์šฉ ์Šคํ† ๋ฆฌ์ง€์— ๊ธฐ๋กํ•œ๋‹ค.
    • SwiftUI ๋Š” objevtWillChange ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ณ  items ์— ์Šค๋ƒ…์ƒท์„ ์ฐ๋Š”๋‹ค.
    • ์Šค๋ƒ…์ƒท ์ดํ›„์˜ ๋‹ค์Œ run loop tick ์—์„œ SwiftUI ๋Š” ์Šค๋ƒ…์ƒท๊ณผ ํ˜„์žฌ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
    • ์Šค๋ƒ…์ƒท๊ณผ ํ˜„์žฌ items ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— View ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  • ์ด ๋ชจ๋“  ๊ณผ์ •์€ Main actor ์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฉ”์ธ์—์„œ ์ž‘์—…ํ•˜๋‹ˆ ๋Š๋ ค์งˆ๊ฑฐ๋ผ๋Š” ํฐ๊ทธ๋ฆผ! ๐Ÿง
    • ์ง€๋‚œ๋ฒˆ์— ๋ณธ Data Essentials ์˜์ƒ์—์„œ main actor ์—์„œ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋Š๋ ค์ง„๋‹ค๋Š” ๊ฒƒ์„ ์ด์•ผ๊ธฐ ํ–ˆ์—ˆ๋‹ค.
    • fetchPhotos() ๋ฉ”์†Œ๋“œ๊ฐ€ ์˜ค๋ž˜๊ฑธ๋ฆด ๊ฒฝ์šฐ ์œ ์ €์—๊ฒŒ hitch ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.
  • DispatchQueue.global().async ์ฝ”๋“œ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์•„๋ž˜ ์ฝ”๋“œ๋Œ€๋กœ๋ฉด ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์•„ SwiftUI view ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
  • await ์„ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ fetch ํ•˜๋Š” ๋™์•ˆ์—๋Š” main ์—์„œ๋Š” ๋‹ค๋ฅธ ์ž‘์—…๋“ค์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , fetch ๊ฐ€ ๋๋‚œ ํ›„์— SwiftUI View ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • objevtWillChange ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋˜๊ธฐ ์œ„ํ•ด Photos ํด๋ž˜์Šค์— @MainActor ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ Main actor ์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์ฃผ์ž.

Task 

https://developer.apple.com/documentation/swiftui/view/task(priority:_:)

 

  • Catalog ๋ทฐ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ž‘์—…์ธ updateItems ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•ด๋ณด์ž.
    • ์ด์ „์—๋Š” appear ๋ฅผ ์ด์šฉํ–ˆ์ง€๋งŒ, task ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ทฐ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • task ๋Š” view ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹œ์ž‘๋˜๊ณ , view ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜๋ฉด task ๋Š” ์ž๋™์œผ๋กœ ์ทจ์†Œ๋œ๋‹ค.
    • ๋ทฐ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์— ๋Œ€ํ•ด์„œ๋Š” Demystify SwiftUI ์˜์ƒ ์ฐธ๊ณ !

 

AsyncImage API

https://developer.apple.com/documentation/SwiftUI/AsyncImage

  • AsyncImage ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋”ฉํ•˜๋‹ค๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ์—๋„ placeholder ๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ๋˜์–ด์žˆ๋‹ค.

SwiftUI View + async await

  • Button ์— ๋Œ€ํ•œ ์•ก์…˜ ๋‚ด๋ถ€์— async - await ์„ ์ด์šฉํ•ด์„œ ๋น„๋™๊ธฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • @State ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋กœ๋”ฉ ์ค‘์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

List - refreshable

func refreshable(action: @escaping () async -> Void) -> some View
https://developer.apple.com/documentation/swiftui/view/refreshable(action:)

  • ์ƒˆ๋กœ๊ณ ์นจ์„ ์œ„ํ•œ refreshable modifier ๊ฐ€ ์ œ๊ณต๋œ๋‹ค.
  • List ์— refreshable ์„ ์ถ”๊ฐ€ํ•ด์„œ ํ•ด๋‹น ์ฝ˜ํ…์ธ ์— pull to refresh ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
  • closure ๋‚ด๋ถ€์— ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•  ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Wrap up

  • SwiftUI ์—์„œ๋„ async ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์†Œ๋“œ๋“ค์ด ์ œ๊ณต๋˜๋‹ˆ, await ์„ ์‚ฌ์šฉํ•˜์ž ! 

 

728x90
728x90