swiftUI: изменение @State при сбоях onAppear - PullRequest
1 голос
/ 13 марта 2020

Я хочу установить переменную @State, если представление вызывается при вызове службы.
Вызов службы в onAppear приводит к сбою приложения.
Вызов службы в действии кнопок работает нормально.

struct ContentView: View {
  @State var dirContent : [String] = []

  var body: some View {
    VStack {
      List {
        ForEach(dirContent, id: \.self){
          fileName in
          Text(fileName)
        }
      }
      Button("Get Data"){self.dirContent = Service.getData()}
    }
    .onAppear{
    //self.dirContent = Service.getData2()   // Crashes!!
    }
  }
}

class Service{
  static func getData()->[String]{
    // ... get Data from somewhere
    return ["line1", "line2"]
  }

  static func getData2()->[String]{
    // ... get Data from somewhere
    return ["line4", "line5"]
  }
}

Что не так?

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

посмотрите, почему это происходит, попробуйте изменить свой код

    var body: some View {
        VStack {
            List {
                ForEach(dirContent, id: \.self){
                    fileName in
                    Text(fileName).onAppear {
                        print("item appear")
                    }
                }
            }.onAppear {
                print("list appear")
            }
            Button("Get Data"){self.dirContent = Service.getData()}
        }
        .onAppear{
            print("content appear")
            DispatchQueue.main.async {
                self.dirContent = Service.getData2()
            }
        }
    }

отладочная печать "старой школы" показывает нам

content appear
list appear
item appear
item appear

Теперь все ясно, не правда ли

0 голосов
/ 13 марта 2020

Я думаю, что понял. Действие должно вызываться асинхронно.

.onAppear{
  DispatchQueue.main.async {
    self.dirContent = Service.getData2()   
  }
}

Есть идеи, почему это не нужно в действии кнопок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...