Principles of Data Flow
Tools for Data Flow
- SwiftUI μμ μκ°λλ Property, BindableObject,@Environment , @Binding ,@State
- 미리 μ€ν¬νμλ©΄ BindableObject -> ObservableObject λ‘ μ΄λ¦μ΄ λ³κ²½λ¨
- μ΄λ² μμμ ν΅ν΄μ ν΄λΉ ν΄λ€μ΄ μ΄λ»κ², μΈμ μ°μ΄λμ§ μκ² λ κ²μ΄λ€!
Principle
SwiftUI λ°μ΄ν° νλ‘μ°λ₯Ό λμμΈνκΈ° μν λκ°μ μ리λ₯Ό μμ보μ.
First principle "Data Access as a Dependency"
- ν κΈμ μκ°ν΄λ³΄μ. ν κΈ λ·°λ₯Ό 그리기 μν΄μλ Bool νμ μ λ°μ΄ν°κ° νμνκ³ , λ°μ΄ν°κ° μλ‘μ΄ κ°μΌλ‘ λ³κ²½λ λλ§λ€ λ·°λ₯Ό λ³κ²½ν΄μ€μΌ νλ€.
- λ°μ΄ν°κ° λ³κ²½λ λλ§λ€ λ·°λ₯Ό λ³κ²½νκΈ° μν΄μλ μλ‘ μμ‘΄μ κ°κ²νλ 볡μ‘ν μ½λλ₯Ό μμ±ν΄μΌλ§ νλ€.
- SwiftUI λ₯Ό μ¬μ©νλ©΄ λ·°μ λ°μ΄ν°κ° μμ‘΄μ±μ μ½κ² ννν μ μκ³ , νλ μμν¬μμ λμμ ꡬνλμ΄ μκΈ° λλ¬Έμ κ°λ°μλ μ μ μ κ²½νμλ§ μ§μ€νλ©΄ λλ€.
Second priciple "Source of Truth"
- κ°μ λ·°λ₯Ό 그릴 λ νμν λ°μ΄ν°κ° μ¬λ¬κ°μ μμ€μμ μ¨λ€λ©΄ λ°μ΄ν°κ° κΌ¬μ΄κ² λκ³ λ²κ·Έλ₯Ό λ§λ€κΈ° μ½λ€.
- μ΅μμ λ·°μμ νμμ λ·°λ₯Ό 그리기 μν λ°μ΄ν°λ₯Ό κ°κ³ μκ³ , ν΄λΉ λ°μ΄ν°λ₯Ό λ·°μκ² μ λ¬νλ©΄ λκ°μ λ·°κ°μ λ°μ΄ν° μ±ν¬κ° λ§κ² λλ€.
- Binding μ μ΄μ©νλ€λ©΄ νλμ λ°μ΄ν°λ₯Ό μ¬λ¬κ°μ μμλ·°λ‘ μ λ¬ν΄ κ°μ λ°μ΄ν°μ μμ²μ λ°λΌλ³΄λλ‘ ν μ μλ€.
Example
SwiftUI View λ immutable νκΈ° λλ¬Έμ, μΌλ°μ μΈ λ³μμ κ°μ λ³κ²½ν μ μλ€.
@State property wrapper λ₯Ό λΆμ¬μ€μΌλ‘μ¨ ν΄λΉ λ³μλ λ·°μμ μμ‘΄ν΄μ κ°μ΄ λ³κ²½λ λλ§λ€ λ·°λ₯Ό λ³κ²½νλλ‘ νλκ² κ°λ₯ν¨μ 보μ¬μ€λ€. νλ‘νΌν° λνΌλ₯Ό λΆμ΄λ κ²μ΄ μμ€ν μκ² ν΄λΉ λ³μλ μκ°μ΄ μ§λ¨μ λ°λΌ κ°μ΄ λ³κ²½λκ³ λ·°μμ ν΄λΉ λ³μμ μμ‘΄ν¨μ μλ €μ£Όλ κ²μ΄λ€.
μ μ κ° λ²νΌμ ν΄λ¦νλ©΄ @State λ³μμ κ°μ΄ λ³κ²½λκ³ , νλ μμν¬λ λ·°μ λν μλ‘μ΄ λ°λλ₯Ό λ§λ€μ΄λΈλ€.
Property Wrapper
Swift 5.1 μμ λ±μ₯ν κΈ°λ₯μΌλ‘, λ³μλ₯Ό λνν΄μ κ°μ μ½κ±°λ μΈ λ νΉμ ν λμμ ν μ μκ² ν΄μ€λ€. @State λ property wrapper μ μΌμ’ μ΄λ€.
@State property wrapper λ₯Ό λΆμ΄λ©΄ μ΄λ€ λμμ΄ μλκ±ΈκΉ?
@State λ₯Ό μ¬μ©νλ©΄ SwiftUI νλ μμν¬λ μ°λ¦¬κ° κ°κ³ μλ λ·°μμ λ³μλ₯Ό μν μꡬ μ μ₯μ(persistent storage)λ₯Ό ν λΉνκ³ , μ’ μμ μΌλ‘ μΆμ νλ€. κ·Έλ¦¬κ³ λμΌν λ·°μ μ¬λ¬ μ λ°μ΄νΈμμ μ€ν 리μ§λ₯Ό μ μ§ν΄μΌ νλ€λ κ²μ μκ³ μκ² λλ€.
μΌλ°μ μΌλ‘ @State property λ λͺ μμ μΌλ‘ private μ νκΈ°ν΄μ state κ° ν΄λΉ λ·°μ μν΄ μμ λκ³ κ΄λ¦¬λλ€λ κ±Έ λνλΈλ€.
Anatomy of an Update
μ μ κ° μ€μ λ‘ λ²νΌμ λλ₯Ό λ μ΄λ€ λμλ€μ΄ μΌμ΄λ κΉ?
- μ μ κ° Button μ λλ₯΄λ©΄ @State λ³μμΈ isPlaying μ κ°μ΄ λ³κ²½λλ€.
- PlayerView μ @State λ³μμ΄λ―λ‘ ν΄λΉ λ·°λ₯Ό μ λ°μ΄νΈνλλ°,
- ν΄λΉ λ·°μ νμμ λ·°λ€, μ¦ λ·° κ³μΈ΅μ μ λΆ μλ‘ λ§λ λ€.
μ¬κΈ°μ μ€μν μ μ λͺ¨λ @State λ λ°μ΄ν°μ μμ²μ΄κ³ , View λ event μ λν μνμ€κ° μλ state μ λν ν¨μλΌλ μ μ΄λ€.
Every @State is a source of truth
Views are a function of state, not of a sequence of events
User interaction and SwiftUI
μ μ μΈν°λ μ κ³Ό SwiftUI μμ μλ‘μ΄ λ·°λ₯Ό 그리λ νλ¦μ λνλΈ κ·Έλ¦Όμ΄λ€. μ μ μ μνΈμμ©μΌλ‘ μ‘μ μ΄ λ°μνκ³ , μ‘μ μΌλ‘ State μ λ³κ²½μ΄ μΌμ΄λκ³ , View λ₯Ό μλ‘ λ§λ€κ³ , μλ‘ λ§λ View λ₯Ό μ μ μκ² λ³΄μ¬μ€λ€.
π§ Code Refactoring
μ΅μμ λ·° PlayerView μμ PlayButton μ λ°λ‘ λΆλ¦¬ν΄λ³΄μ.
μ°μ , PlayButton λ΄μμλ @State λ³μλ₯Ό μ¬μ©νλ©΄ μλλ€.
λ°μ΄ν°μ μμ²μ λ€λ₯Έκ²μΌλ‘ λ μ μκ³ , ν΄λΉ λ·°λ μ¬μ¬μ©λλ λ·°μ΄κΈ° λλ¬Έμ λ°μ΄ν°μ μμ²μ κ°μ§ μ μλ€. λΆλͺ¨λ·°μΈ PlayerView μ λ³μλ₯Ό μ¬μ©ν΄μ κ°μ λ°μ΄ν°μ μμ²μ λ°λΌλ΄μΌ νλ€.
PlayButton λ΄μμλ @Binding property wrapper λ₯Ό μ¬μ©ν΄ λ°μ΄ν°λ₯Ό λνλ΄μ.
Binding λ³μλ μ΄κΈ°κ°μ κ°μ§ μκ³ , νμ λ§ μ§μ νλ€.
State λ³μμ λ¬λ¬ νμλ₯Ό λΆμ¬μ PlayButton μ μ λ¬ν΄μ€λ€.
$ λ¬λ¬ νμλ property wrapper μ λλ€λ₯Έ κΈ°λ₯μ΄λ€. $ λ₯Ό λΆμ¬ State λ³μλ₯Ό binding λ³μλ‘ μ λ¬νλ€.
π UIKit vs SwiftUI
UIKit μμλ ViewController μμ λ²νΌμ νκ² μ‘μ μ μ€μ νκ±°λ, delegate λ₯Ό μ μν΄μ λ°μ΄ν°λ₯Ό μ λ¬νλ μμ μ μ λΆ μννκΈ° λλ¬Έμ ν€λΉν΄μ‘λ€.
κ°λ°μκ° μ§μ μ€μ ν΄μ€μΌνλ λ·°μ λ·° μ¬μ΄μ λ°μ΄ν° μ±ν¬ λ§μΆκΈ° λ±μ μ΄μ SwiftUI μμ λ΄λΉν΄μ£ΌκΈ° λλ¬Έμ, ViewController λ λμ΄μ μ¬μ©ν νμκ° μλ€ πππ
Toggle, TextField, Slider λͺ¨λ μμ±μμμ Binding λ³μλ₯Ό λ°λλ‘ λμ΄μλ€. SwiftUI νλ μμν¬μμ sourth of truth λ₯Ό 보μ₯ν΄μ£ΌκΈ°μ λ μ΄μ λ°μ΄ν°λ₯Ό 볡μ¬ν΄μ μ λ¬νκ±°λ, λ°μ΄ν°μ μ±ν¬λ₯Ό λ§μΆ νμκ° μλ€.
'π iOS > WWDC' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[WWDC18] iOS Memory Deep Dive (2) | 2022.11.27 |
---|---|
[WWDC19] Advances in Collection View Layout - Part 1 (0) | 2022.10.17 |
[WWDC19] Data Flow Through SwiftUI - Part 2 (0) | 2022.08.30 |
[WWDC19] LLDB: Beyond "po" (0) | 2022.07.04 |
[iOS] SnapKit / Then λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©ν΄ μ½λλ‘ UI ꡬννκΈ° (0) | 2021.11.11 |