iOS SwiftUI: поток данных в подпредставлениях @ObservedObject - PullRequest
0 голосов
/ 12 октября 2019

У меня проблема с обновлениями в моем приложении. Я не очень хорошо понимаю, что происходит с потоком данных между подпредставлениями.

Это моя текущая структура

  • ViewModel :ObsebsrvableObject

  • MainView с ObservedObject (viewModel)

    • ChildView со списком наблюдаемого объекта MainView (простосписок передается как обычный массив - без привязки)
      • NephewView со списком, переданным в childView, все еще как обычный массив

Что происходит:

Каждый раз, когда я изменяю список, обновления MainView запускают новую перестройку ChildView, но NephewView не обновляет

Что яхотел бы иметь:

Я хотел бы обновлять представления Main, Child и NephewView каждый раз, когда наблюдаемый объект получает обновление

Проблема:

Я не могупонять, почему, если перестроить Child View, племянник этого не сделает.

ПримерКод

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...
  }
}

Раковина работает правильно, только часть пользовательского интерфейса не получает обновлений. Может быть, способ обновления издателя неправильный?

1 Ответ

0 голосов
/ 16 октября 2019

Ваш MainView

 ChildView(items: $model.items)

Ваш ChildView

struct ChildView: View {
  @Binding let items: [Items]
  var body: some View {
     List { 
     ForEach(self.items) { item in
           NephewView(items: item)
          }
        }
      }
    }

Ваш NephewView

struct NephewView: View {
  @Binding let items: item

  var body: some View {
    // Your view logic goes here with single item
  }
}

...