iOS SwiftUI:子视图@ObservedObject 中的数据流
iOS SwiftUI: Data Flow Flow in Subviews @ObservedObject
我的应用程序有更新问题。
我不太明白子视图之间的数据流是怎么回事。
这是我当前的结构
ViewModel: ObsebsrvableObject
MainView with ObservedObject (viewModel)
- ChildView 带有来自 MainView 观察对象的列表(只是列表作为普通数组传递 - 不可绑定)
- NephewView 将列表传递给 childView,仍然是普通数组
发生了什么:
每次我修改列表时,MainView 都会更新并触发 ChildView 的新重建,但 NephewView 不会更新
我想要的:
我想在每次 observedObject 获得更新时更新 Main、Child 和 NephewView 视图
问题:
我不明白为什么如果子视图重建,侄子不重建。
示例代码
class ViewModel: ObservableObject {
let userData = UserData.shared
var canceller: AnyCancellable?
@Published var items: [Items]
init() {
items = []
canceller = userData.objectWillChange
.throttle(for: 5, scheduler: RunLoop.main, latest: true)
.sink(receiveCompletion: { data in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.items = data.items
}
},
receiveValue: { _ in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.items = data.items
}
})
}
}
struct MainView: View {
@ObservedObject var model = ViewModel()
var body: some View {
ChildView(items: model.items)
}
}
struct ChildView: View {
let items: [Items]
var body: some View {
NephewView(items: items)
}
}
struct NephewView: View {
let items: [Items]
var body: some View {
List...
}
}
接收器工作正常,只是 UI 部分没有得到更新。
也许我更新发布者的方式不对?
您的主视图
ChildView(items: $model.items)
您的子视图
struct ChildView: View {
@Binding let items: [Items]
var body: some View {
List {
ForEach(self.items) { item in
NephewView(items: item)
}
}
}
}
你的外甥观点
struct NephewView: View {
@Binding let items: item
var body: some View {
// Your view logic goes here with single item
}
}
我的应用程序有更新问题。 我不太明白子视图之间的数据流是怎么回事。
这是我当前的结构
ViewModel: ObsebsrvableObject
MainView with ObservedObject (viewModel)
- ChildView 带有来自 MainView 观察对象的列表(只是列表作为普通数组传递 - 不可绑定)
- NephewView 将列表传递给 childView,仍然是普通数组
- ChildView 带有来自 MainView 观察对象的列表(只是列表作为普通数组传递 - 不可绑定)
发生了什么:
每次我修改列表时,MainView 都会更新并触发 ChildView 的新重建,但 NephewView 不会更新
我想要的:
我想在每次 observedObject 获得更新时更新 Main、Child 和 NephewView 视图
问题:
我不明白为什么如果子视图重建,侄子不重建。
示例代码
class ViewModel: ObservableObject {
let userData = UserData.shared
var canceller: AnyCancellable?
@Published var items: [Items]
init() {
items = []
canceller = userData.objectWillChange
.throttle(for: 5, scheduler: RunLoop.main, latest: true)
.sink(receiveCompletion: { data in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.items = data.items
}
},
receiveValue: { _ in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.items = data.items
}
})
}
}
struct MainView: View {
@ObservedObject var model = ViewModel()
var body: some View {
ChildView(items: model.items)
}
}
struct ChildView: View {
let items: [Items]
var body: some View {
NephewView(items: items)
}
}
struct NephewView: View {
let items: [Items]
var body: some View {
List...
}
}
接收器工作正常,只是 UI 部分没有得到更新。 也许我更新发布者的方式不对?
您的主视图
ChildView(items: $model.items)
您的子视图
struct ChildView: View {
@Binding let items: [Items]
var body: some View {
List {
ForEach(self.items) { item in
NephewView(items: item)
}
}
}
}
你的外甥观点
struct NephewView: View {
@Binding let items: item
var body: some View {
// Your view logic goes here with single item
}
}