счетчик возврата из представления CoreData SwiftUI

У меня есть представление SwiftUI, которое отображает результат запроса CoreData.
В родительском представлении я хочу отобразить счетчик запроса (без повторного запроса).
Я попытался передать счет родительскому элементу в привязке, но я получаю предупреждение «Изменение состояния во время обновления представления приведет к неопределенному поведению». это не работает.

import SwiftUI

struct CD_Main: View {
  @State var count = 0

    var body: some View {
      VStack {
        Text("count in main: \(count)")
        CD_Query(c: $count)
      }
    }
}

struct CD_Query: View {
  @Binding var c : Int

  @Environment(\.managedObjectContext) var moc
  @FetchRequest(entity: Item.entity(), sortDescriptors: [], predicate: nil) var items: FetchedResults<Item>

  var body: some View {
  c = items.count // Produces: Modifying state during view update, this will cause undefined behavior.
    return VStack {
      Text("Count Innen: \(items.count) ")
      List(items, id: \.self) {
        item in
        Text(item.title)
      }
    }
  }
}

Есть идеи, как правильно установить привязку или как еще передать счет родителю?


person mica    schedule 14.02.2020    source источник
comment
для справки 1. hackingwithswift.com/quick-start/swiftui/ 2. stackoverflow.com/questions/57340970/ 3. swiftui-lab.com/state-changes   -  person Gagan_iOS    schedule 14.02.2020


Ответы (1)


Вместо этого попробуйте следующее

  var body: some View {
    VStack {
      Text("Count Innen: \(items.count) ")
      .onAppear { // actually it does not matter to which view this attached
         DispatchQueue.main.async {
            self.c = items.count // update asynchronously
         }
      }
      List(items, id: \.self) {
        item in
        Text(item.title)
      }
    }
  }
person Asperi    schedule 14.02.2020
comment
Если моему представлению нужен инициализатор init(c: Binding<Int>) {....}, я получаю сообщение об ошибке «Возврат из инициализатора» без инициализации всех сохраненных свойств. Почему (и как) нужно инициализировать привязку - person mica; 14.02.2020
comment
@mica, вы можете увидеть пример здесь или выполнить поиск других на SO. - person Asperi; 14.02.2020