์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- MVVM
- ๋ฐฑ์ค
- BFS
- UIKit
- arkit
- ํจ์คํธ์บ ํผ์ค
- realm
- Lv2
- tableView
- designpattern
- ios
- Kuring
- SnapKit
- rxcocoa
- Swfit
- RxSwift
- raywenderlich
- swift
- Xcode
- CollectionView
- reactorkit
- BOJ
- visionOS
- Flutter
- node.js
- XCTest
- SwiftUI
- ํ๋ก๊ทธ๋๋จธ์ค
- combine
- TCA
- Today
- Total
lgvv98
[SwiftUI] State and Data Flow ๋ณธ๋ฌธ
State and Data Flow
โ ์๋์ ๋ฌธ์ ์ค ํ์ํ ๋ถ๋ถ์ ๊ณจ๋ผ์ ์์ฑํ์์ต๋๋ค.
https://developer.apple.com/documentation/swiftui/state-and-data-flow
Apple Developer Documentation
developer.apple.com
SwiftUI๋ user interface ๋์์ธ์ ์ ์ธ์ ์ผ๋ก ์ ๊ณตํ๊ณ ์๋ค. (์ ์ธํ ํ๋ก๊ทธ๋๋ฐ) ๋ฐ๋ผ์ view๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์ฑํ ๋ views๋ฅผ ์ํ ๋ฐ์ดํฐ๋ ์ข ์์ฑ๋ ํ์ํ๋ค. ์ธ๋ถ ์ด๋ฒคํธ ํน์ user๊ฐ ์ทจํ๋ ์ก์ ์ ์ํด ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์์ ๋, SwiftUI์ ์ํฅ์ ๋ฐ๋ ๋ถ๋ถ์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ํ๋ ์์ํฌ(SwiftUI)๋ ์ ํต์ ์ผ๋ก viewController์์ ํ๋ ๋๋ถ๋ถ์ ์ผ์ ์ํํฉ๋๋ค.
์ฝ๊ฒ ๋งํด์ SwiftUI์์๋ MVVM ํจํด์์ ViewController์ ์ญํ ์ ๋๋ถ๋ถ ๊ฐ์ ธ๊ฐ๋ค๊ณ ๋ด.
โ SwiftUI์๋ @State ๋ฐ @Binding์ ์ ๊ณตํ์ฌ user interface์ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ค์ ์ฑ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํ ๋จ์ผ ์์ค๋ฅผ ์ ์งํ๋๋ฐ ๋์์ ์ฃผ๋ฉฐ, ์์ฑํด์ผ ํ๋ ๋ก์ง์ ์์ ์ค์ฌ์ค๋๋ค.
(ํด๋ก์ ๋ delegate ํน์ notification ๋ฑ์ ์ด์ฉํด์ ์ฒ๋ฆฌํ๋ ๊ธด ๋ก์ง์ RxSwfit๋ฅผ ์ฌ์ฉํ๋ฉด์ ํฌ๊ฒ ์ค์ธ ๊ฒ์ฒ๋ผ ์ด์ ๊ฐ์ ์ด์ผ๊ธฐ!)
โ ์ ํ ๊ณต์๋ฌธ์์ ์ค๋ช !
์๋์ ์ค๋ช ์ ์์ธํ๊ฒ ํ๊ณ ์์ต๋๋ค. ๊ธ์ ํ๋ฆ์ ์ฐจ๋ก๋ก ๋ฐ๋ผ๊ฐ๋ณด์ฃ !
๐ SwiftUI์ LifeCycle
- SwiftUI์๋ View์ ์ํ๋ฅผ ๋ํ๋ด๋ ํจ์๊ฐ ๋จ ๋ ๊ฐ ์กด์ฌํฉ๋๋ค.
- ๋์ ์ํ๋ฅผ ๋ํ๋ด๋ ๋ค์ํ Property Wrapper๊ฐ ์กด์ฌํด Data ํ๋ฆ์ ๋ํ ์ฌ๋ฌ ์ํ์ ๋์ํ ์ ์์ต๋๋ค.
.onAppear {
print("ViewAppeared") // viewDidAppear
}
.onDisappear {
print("ViewDisappeared")
}
๐ @State
- struct๋ value type์ด๋ผ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋, SwiftUI์์ @State๋ฅผ ์ ๊ณตํด strcut๋ด์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ค๋๋ค.
- mutating๊ณผ ๋น์ทํฉ๋๋ค. swiftUI์์ ์ผ๋ฐ์ ์ผ๋ก View๋ฅผ struct๋ก ์์ฑํ๋๋ฐ ๊ฐ์ ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ class๋ก๋ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ UIRepesentView๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด final๋ก ํด์ผํฉ๋๋ค. ์ด๊ฑด ๋ด๊ฐ ํด๋ด์ ์ฐธ๊ณ !
- ์ผ๋ฐ์ ์ผ๋ก @State๋ private์ผ๋ก ์ ์ธ๋๊ณ , ๋ค๋ฅธ view์ ๊ณต์ ํ์ง ์์ต๋๋ค.
- ๋ค๋ฅธ view์ ๊ณต์ ํ๊ณ ์ถ๋ค๋ฉด, @StateObject๋ @ObservedObject๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๐ @Binding
- @Binding์ ๋ถ๋ชจ view์ @State์ ๊ฐ์ ๊ฐ์ ์๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐ๋๋๋ก ํด์ค๋๋ค.
- ์๋ ์ฝ๋์์ isPresented๋ showAddView๋ฅผ ๋ฐ์ธ๋ฉ ์์ผ์ค์ ๊ฐ์ ๋ณ๊ฒฝํด์ค๋๋ค.
- @Binding์ ๊ฒฝ์ฐ์๋ init์ ํตํด์ ์ฌ์ฉํ๋๊ฒ ๊ฐ์ธ์ ์ผ๋ก ๊น๋ํฉ๋๋ค. ๋ํ init ์์์ .constant()๋ก ์ด๊ธฐ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
struct ContentView: View {
@State private var showAddView = false
var body: some View {
VStack {
Text("Hello World.")
}
}
.sheet(isPresented: $showAddView) {
AddView(isPresented: self.$showAddView)
}
}
struct AddView: View {
@Binding var isPresented: Bool
var body: some View {
Button("Dismiss") {
self.isPresented = false
}
}
}
์ฌ๊ธฐ๊น์ง๋ Combine์ ๊ฐ๋ ์ ๋ชจ๋ฅด๋๋ผ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋ด๊ฐ ์ด ๊ธ์ ํฌ์คํ ํ๋ ์ด์ ๋ ์ฌ๊ธฐ๋ถํฐ์ธ๋ฐ, ํ๋ก์ ํธ์์ SwiftUI์ MVVM์ ์ ์ฉํด์ ViewModel์ ๋ถ์ด๋ ค๊ณ ํ ๋ ํ๋ฒ ์ ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ๋๊ปด์๋ค.
๐ ObservableObject: Property Wrapper๊ฐ ์๋ protocol์ ๋๋ค!!
- ObservableObejct๋ Protocol์ด๋ฉฐ, Combine ํ๋ ์์ํฌ์ ์ผ๋ถ์ ๋๋ค.
- ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ๋กํ ์ฝ์ ์ค์ํ๊ณ , @Published๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
- @Published๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์์ ๊ฐ์ด ์ถ๊ฐ๋๊ฑฐ๋ ์ญ์ ๋์๋ค๋ ๊ฒ์ view๊ฐ ์ ์ ์๊ฒ ํด์ค๋๋ค.
- ObservableObject๋ MVVM ์ํคํ ์ณ์ viewModel์ ์ ์ฉํ๊ธฐ ์ข์ ํ๋กํ ์ฝ์ ๋๋ค.
- ObservableObject protocol์ ObservedObeject property wrapper๋ฅผ ์ด์ฉํ์ฌ ์ธ๋ถ ์ฐธ์กฐ ๋ชจ๋ธ์ ์ฐ๊ฒฐํฉ๋๋ค.
๐ ์์์ฝ๋ 1 (์ ํ ๊ณต์๋ฌธ์)
class Contact: ObservableObject {
@Published var name: String
@Published var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func haveBirthday() -> Int {
age += 1
return age
}
}
let john = Contact(name: "John Appleseed", age: 24)
cancellable = john.objectWillChange // ๐ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ฐฉ์ถํฉ๋๋ค.
.sink { _ in
print("\(john.age) will change")
}
print(john.haveBirthday())
// Prints "24 will change"
// Prints "25"
๐ ์์์ฝ๋ 2 (์ฐธ๊ณ ๋งํฌ)
์ด๋ ๊ฒ ๋ชจ๋ธ ์์ฒด๋ฅผ ๊ฑธ์ด๋๋ฉด ๋์ฑ ํธ๋ฆฌํฉ๋๋ค.
class MyViewModel: ObservableObject {
@Published var dataSource: MyModel
init(dataSource: MyModel) {
self.dataSource = dataSource
}
}
๐ @StateObject
- WWDC2020์์ @StateObject๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๊ณต๊ฐํ์ต๋๋ค.
- @ObservedObject์ ๊ฑฐ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค.
- SwiftUI๊ฐ View๋ฅผ ๋ค์ ๋ ๋๋ง ํ ๋, ์ค์๋ก ์ทจ์๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
- view์์ @StateObject๋ฅผ ์ด์ฉํ์ฌ ์ง์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํ ํฉ๋๋ค.
ํด๋น ํ๋กํผํฐ ๋ํผ์ ๋ํ ์์ธํ ์ค๋ช ์ ๋๋ค.
2022.06.02 - [iOS/SwiftUI] - [SwiftUI] @StateObject
[SwiftUI] @StateObject
@StateObject โ ์๋ ๊ณต์๋ฌธ์๋ฅผ ๋ฐํ์ผ๋ก ์์ฑํ์์ต๋๋ค. https://developer.apple.com/documentation/swiftui/stateobject Apple Developer Documentation developer.apple.com ํน์ฑ ์ ์ธ์ @StateObject ์..
rldd.tistory.com
๐ ์์์ฝ๋
struct ContentView: View {
@StateObject var user = User()
}
๐ @ObservedObject - ObservableObject๋ ๋ค๋ฆ ๋๋ค!!
- SwiftUI๋ @ObservedObject๋ฅผ ํตํด view๊ฐ ์ธ๋ถ ๊ฐ์ฒด๋ฅผ ๊ฐ์งํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์๋ ์ฝ๋์์ User class๋ ObservableObject๋ฅผ ์ค์ํ๊ณ @Published ๋ณ์๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
- @ObservedObject์ user ๋ณ์๋ ์ด๋ฌํ User class ๊ฐ์ฒด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
- SwiftUI๋ ์ด๋ฌํ user ๊ฐ์ฒด์ @Published ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ view๋ฅผ refreshํฉ๋๋ค.
class User: ObservableObject {
@Published var name = "Hohyeon Moon"
}
struct ContentView: View {
@ObservedObject var user = User()
var body: some View {
VStack {
Text("Your name is \(user.name).")
}
}
}
๐ @EnvironmentObject
- @EnvironObject๋ ๋ณดํต ์ฑ ์ ๋ฐ์ ๊ฑธ์ณ ๊ณต์ ๋๋ ๋ฐ์ดํฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
- @EnvironObject๋ .environmnetObejct()๋ฅผ ํตํด ๊ฐ์ด ์ ๋ฌํ ์ ์์ต๋๋ค.
- ์ ๋ฌํ๋ Object๋ ObservableObject ํ๋กํ ์ฝ์ ์ค์ํด์ผ ํฉ๋๋ค.
- ์๋ ์ฝ๋์ ๊ฐ์ด rootView๋ฅผ ์ ๊ณตํ๋ฉด, ์ด๋ ํ view์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- EnvironmentObject property wrapper๋ฅผ ํตํด์ environmnet์ ์ ์ฅ๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ๊ฐ์ฒด์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๐ ์์์ฝ๋
import SwiftUI
// MySettings.swift
class Settings: ObservableObject {
@Published var version = 0
}
@main
struct CombinePracticeApp: App {
var body: some Scene {
WindowGroup {
ContentView().environmentObject(Settings())
}
}
}
struct ContentView: View {
@EnvironmentObject var settings: Settings
var body: some View {
Text("Hello, world!")
.padding()
Button {
settings.version += 1
} label: {
Text("version \(settings.version)")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
์ฌ๊ธฐ์ ์ ๊น! ObservableObject์ EnvironmentObject๊ฐ ๋น์ทํ ๊ฒ ๊ฐ์์ ์ฐจ์ด๋ฅผ ์ง์ด๋ณด์.
EnvironmentObject์ ์ค๋ช ์ StateObject์ ๋ฃ์ด๋์๊ณ , ์๋๋ฉด ์๋์์ ๋์ค๋๊น ์ถํ์ ์ฌ๊ธฐ๋ฅผ ๋ค์ ๋ณด์๋ ์ข์ต๋๋ค. ๋ค๋ง ์ ๋ ์ด๋ฏธ ์๊ณ ์๊ธฐ์ ์ด์ฏค์์ ์ง๊ณ ๊ฐ๋๊ฒ ๋ง๋ค๊ณ ์๊ฐ๋์ด์ ์ฌ๊ธฐ์ ๊ธ์ ์ ๋ฆฌํฉ๋๋ค.
1. UI ๋ฐ์ ์์นํ๋ฉด์ ์ฑ ๋ด์ SwiftUI ๋ทฐ ๊ตฌ์กฐ์ฒด์ ํ์ ๋ทฐ์๋ง ํ์ํ ๋ฐ์ดํฐ์ ObservableObject์ฌ์ฉ
2. UI ๋ฐ์ ์์นํ๋ฉด์ ์ฌ๋ฌ ๋ทฐ์์ ์ ๊ทผํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ Environment ์ค๋ธ์ ํธ ํ์ฉ
View1์ Timer์ ์๊ฐ์ View2A - View2B์์ ๊ณต์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค๊ณ ํ์.
ObservableObject์ฌ์ฉํ๋ฉด ๊ทธ๋ฅ ํ๋ฉด๋๋ค.
๋ค๋ง EnvironmentObject๋ฅผ ์ฌ์ฉํ๋ฉด ContentView().environment( )๋ฅผ ์์ฑํ๋ ๋ณ๊ฒฝ์ด ํ์ํ๋ค.
๊ฒฐ๋ก ์ ๊ฐ๋ฐ ํ๋ก์ฐ์ ๋ฐ๋ผ์ ์ค์ค๋ก ์ด๋ค๊ฒ ๋ ํธํ ์ง ์ ํํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฌ๊ธฐ๋ถํฐ๋ ์กฐ๊ธ ์์๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. ์กฐ๊ธ ๋ ๊ฐ๋ณ๊ฒ ๋ณด์ ๋ ์ข์ต๋๋ค:)
๐ PreferenceKey
- ํ๋์ ๋ทฐ์ ์ฌ๋ฌ ํ์ํญ๋ชฉ(children)์ด ์๋ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก ์์ ํญ๋ชฉ์์ ๋ณผ ์ ์๋ ๋จ์ผ ๊ฐ์ผ๋ก ๊ฒฐํฉํ๋ค.(ํต์ผํ๋ค.)
- key - value๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ ์ ๋ฌ ์๋จ์ ๋๋ค.
- ์ ๋ฌ ๋ฐฉํฅ์ ํ์๋ทฐ -> ์์๋ทฐ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ด์ ๋ฆฌ - ์ด๊ฑด ๋ค๋ฅธ ๋ถ์ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
(์ฐธ๊ณ )
https://www.hohyeonmoon.com/blog/swiftui-data-flow/
SwiftUI์ ๋ฐ์ดํฐ ํ๋ฆ | Hohyeon Moon
Hohyeon Moon iOS developer. Code for a happier life. Resume
www.hohyeonmoon.com
https://velog.io/@budlebee/SwiftUI-ObservableObject
SwiftUI : ObservableObject ์ EnvironmentObject
์ฌ๋ฌ View ์์ ์ฌ์ฉ๋ State ๋ฅผ ํ๋ฐ ์ ์ฅํด ๋๊ณ ์ธ ์ ์๋ ๊ธฐ๋ฅ.๋งค ์ด๋ง๋ค ์ซ์๊ฐ 1์ฉ ๋์ด๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด๋ณด์. ์ดํ๋ฆฌ์ผ์ด์ ์๋ ๋๊ฐ์ View๊ฐ ์๊ณ (ContentView, SecondView), ๋๊ฐ์ View
velog.io
https://velog.io/@kipsong/SwiftUI-Preference-Key-coordinatespace
[SwiftUI] Preference Key & coordinatespace
Preferencekey - value ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ ์ ๋ฌ ์๋จ์ ๋๋ค.์ ๋ฌ ๋ฐฉํฅ์ ํ์๋ทฐ -> ์์๋ทฐ ์ ๋๋ค.๊ตฌํ๋ฐฉ๋ฒreduce ๋ฉ์๋ ์ฐ๋ฆฌ๊ฐ ์ ์ธํ “PreferenceKey” ๋ฅผ ์ฌ์ฉํ๋ ํ์๋ทฐ๋ฅผ ์ํํฉ๋๋ค. ๋์์, ์์๋ทฐ
velog.io
https://protocorn93.github.io/tags/PreferenceKey/
Best Website Builder Online | Yoursite
Start Your Site & Connect With The World. Create your website and go online now! All plans include custom mailboxes and web hosting.
yoursite.com
'apple > ๐ SwiftUI & Combine' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Combine] Let's study Combine! (feat. SwiftUI) (0) | 2022.06.03 |
---|---|
[SwiftUI] @StateObject (0) | 2022.06.02 |
[iOS] ํ๋ฉด ์คํฌ๋ฆฐ์ท ๋ฐ ๋ นํ ๊ฐ์ง (feat. SwiftUI) (0) | 2022.06.02 |
[SwiftUI] ViewModifier (0) | 2022.06.02 |
[SwiftUI] lazyVGrid (0) | 2022.05.25 |