SwiftUI сохраняют наблюдаемые объекты - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь понять потоки данных в swiftUI.

Я создал ViewModel, которая содержит некоторые данные из сетевого запроса.

import SwiftUI

struct breakdown: Decodable {
    var sms: Int
    var im: Int
    var total: Int
}

struct weeklyOverviewStruct: Decodable {
    var data: [breakdown]
}

class WeeklyOverviewViewModel: ObservableObject {

    @Published var overviewData: weeklyOverviewStruct?

    func getBreakdown(){

        semaphore.wait()

              Network.Request(method: .GET , parameters: nil, endPoint: "rest/operator/stats/weekly/breakdown", completion: {
                         result,error  in

                         if(error == nil){

                          do {
                              let breakdown = try JSONDecoder().decode(weeklyOverviewStruct.self, from: result!)
                            DispatchQueue.main.async {

                                self.overviewData = breakdown

                            }

                          }catch{
                              print("Json Error")
                          }
                         }else{
                             print("\(error!)")
                         }
                     })
    }

}

Насколько я понимаю, я могу наблюдать эту ViewModel во втором представлении, и представление будет перерисовываться заново. если ViewModel изменяется:

struct SecondView: View {

     @ObservedObject var WeeklyOverviewVM = WeeklyOverviewViewModel()

       var body: some View {
        Text(String.init(describing: WeeklyOverviewVM.overviewData?.data[0].total))
    }
}

Если, однако, второе представление представлено после вызова getBreakDown (), наблюдается наблюдаемый объект равен нулю.

Существует ли способ сохранения данных, чтобы даже если представление вызывается после вызова функции getBreakdown (), данные из предыдущего запроса можно наблюдать во втором представлении?

1 Ответ

0 голосов
/ 28 апреля 2020

SecondView теперь создает модель представления каждый раз, когда она создается, поэтому, если вы хотите, чтобы ранее извлеченные данные сохранялись, ему нужно сохранить этот экземпляр модели представления где-то за пределами SecondView и добавить его при создании, как * 1003. *

struct SecondView: View {
     // only declare
     @ObservedObject var WeeklyOverviewVM: WeeklyOverviewViewModel 

и где-то в родительском представлении

    ...
    // inject WeeklyOverviewViewModel from own property
    SecondView(WeeklyOverviewVM: self.secondViewVM)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...