SwiftUI DataFlow
问题
- view 和 data 怎么 two-way 绑定,View怎么跟随Data的变化进行刷新
- view 和 data 声明周期
- 不同view之间怎么share data
- @State @Binding @StateObject @Obapproachserver初始化失败是怎么解决ableObject @Observere线程池dObject @EnvirmentObject 差异
为什么需求SwiftUI
graph TD
Code --> initialView
Code --> updateView
updateView --> updateVieww
updateView --> updateData
平时咱们在code页面代码的时分,codepath并不是单一路径的,许多情况下,datapplea和view不统一导致问题的发生。
为了初始化电脑时出现问题编写维护性更高的代码。
graph TD
code --> data
data --> view
siggle code path,线程是什么意思应呼声而出。
咱们运用SappetitewiftUI并不是说为了优化多少性能,而是提高代码的可维护性。运用框架防止问题的的发生。
SwiftUI的根本结构
struct SomeView: View {
var body: some View {
Text(" some view ")
}
}
一切的视图组件都是value类型的struct,随时随地rebuild.
假如这样的struct持有页面状况,当页初始化电脑时出现问题未进行更改面刷新的时分,一切的状况是否都会回归到默许状况?
这时分就需求咱们property wrapper登场了
struct SomeView: View {
@State var someState = false
var someValue = ""
var body: some View {
Text(" some view ")
}
}
@State @Binding
graph TD
ContentView --> SomeView持有someValue
ContentViewObject --> SomeViewObject持有someState
- @State修饰的apple特点,不会由视图保存,而APP是另外保存。线程池所以让视swift代码图rebuild的时分,视图的状况也不会丢失。
- 由于Swift中的特点都是值类型,所以假如多个视图想share state怎么办?
这时分就需求@binding 拿到 @state的引证。来sh初始化游戏启动器失败are data.
struct SomeView: View {
@State var someState = false
var body: some View {
OtherView(someState: $someState)
}
}
struct OtherView: View {
@Binding var someState: Bool
var body: some View {
Text("")
}
}
假如我有许多State,假如处理?
这儿就引进StateObject的概念
@StateObjapplicationect @Obser线程数是什么vedObject ObservableObject
类比@State声明单一特点application,@StateObject可以application修饰一个杂乱的状况目标。状况目标里面的特点是否是State,可以足有控制。
- 遵循
ObservableObject
协议,运用@puapproachblished
来Wrapper需求呼应视图呼应的特点 - valueswift是什么 changed 必须在主线程
// 声明一个complexObject
class ComplexObject: ObservableObject {
// 可相应视图rebuild的state
@Published var someState = false
var someValue = true
}
// 持有complexObject
struct SomeView: View {
@StateObject var someStateObject = ComplexObject()
var body: some View {
OtherView(someStateObject: someStateObject)
}
}
// 仅运用
struct OtherView: View {
@ObservedObject var someStateObject: ComplexObject
var body: some View {
Text("")
}
}
这儿有几个点讲一下
Q:为什么ComplexObject运用class
A: 由于ObservableObject必须遵循AnyObject,必须是class
Q: share State 不运用 $ 符号了
A: 由于是class,原本便是引证类型
Q: StateObject 和 ObservedObject的差异
A: 相似State 和 Binding,一个是持有运用状况,一个仅仅是运用状况
多视图share state需求视图初始化一个一个传递,也太麻烦了。所以引出咱们的@EnvironmentObject
@EnvironmentObject
// 声明一个complexObject
class ComplexObject: ObservableObject {
// 可相应视图rebuild的state
@Published var someState = false
var someValue = true
}
// 持有complexObject
struct SomeView: View {
@StateObject var someStateObject = ComplexObject()
var body: some View {
//>>>>>>>>>>>>>>>>>>>>>>>看这儿>>>>>>>>>>
OtherView()
.environmentObject(someStateObject)
//
}
}
// 仅运用
struct OtherView: View {
//>>>>>>>>>>>>>>>>>>>>>>看这儿
@EnvironmentObject var someStateObject: ComplexObject
var body: some View {
Text("")
}
}
- 运用environmentObject的midifapproveier注入目标
- 从EnviswifterronmeAPPntObject取出目标
简单粗暴
参考
whats-the-difference-between-observedobject-state-and-environmentobject