приложение cra sh при успешной инициализации данных MVVM - PullRequest
0 голосов
/ 11 апреля 2020

мои приложения обрабатывают sh, когда я пытаюсь передать данные в другой контроллер, но они успешно загрузили данные в мой viewController. хотя это довольно странно, потому что данные успешно отображаются на моем ярлыке, а мой imageView - на контроллере, и я могу подозревать, что данные еще не загружаются. но если данные не загружаются, почему imageView отображает мои данные, здесь я покажу вам свой код.

// This is my schoolListViewModel
class SchoolListViewModel {

    private(set) var schoolListViewModel = [SchoolViewModel]()
    private let services: ProfileServices
    private let schools = UserDefaults.getSelectedSchool()

    var count: Int {
        return schoolListViewModel.count
    }

    var id: String {
        selectedSchoolID()
    }

    var imageUrl: String {
        selectedSchoolImageURL()
    }

    var schoolName: String {
        selectedSchoolName()
    }

    var schoolCity: String {
        selectedSchoolCity()
    }

    init(services: ProfileServices) {
        self.services = services
    }
}

extension SchoolListViewModel {

    func loadData(success: @escaping (() -> Void), failure: @escaping ((String) -> Void)) {
        services.fetchSchoolList { [weak self] result in
            switch result {
            case .success(let schools):
                self?.schoolListViewModel = schools.compactMap({ SchoolViewModel(school: $0)
                })
                success()
            case .failure(let error):
                failure(error.localizedDescription)
            }
        }
    }
}

// this is in my profileViewController
   var schoolListViewModel: SchoolListViewModel!
   private let profileServices = ProfileServices()

// this is my viewModel in my viewDidLoad
   progressHUD.show(in: self.view)
   schoolListViewModel = SchoolListViewModel(services: profileServices)
   schoolListViewModel.loadData(success: {
      self.progressHUD.dismiss(animated: true)
      self.populateSchool()
   }) { [weak self] error in
      self?.showHUDWithError(error)
   }

   schoolSelectionBtn.addTarget(self, action: #selector(handlePickSchool), for: .touchUpInside)

// This is my objc function
   private func showHUDWithError(_ error: String) {
        progressHUD.textLabel.text = "Error"
        progressHUD.detailTextLabel.text = error
        progressHUD.dismiss(afterDelay: 4)
    }

   @objc private func handlePickSchool() {
      let selectSchoolVC = SelectSchoolPopUpVC()
      selectSchoolVC.schoolListViewModel = schoolListViewModel

      present(selectSchoolVC, animated: true, completion: nil)
   }

// this is in my SchoolPopUpVC controller
var schoolListViewModel: SchoolListViewModel!

// this is where the error goes in my schoolPopUpVC tableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return schoolListViewModel.count
    }

здесь, когда я пытаюсь передать данные, ошибка отображается в моем tableView numberOfRowsInSection

неожиданно обнаружен ноль при попытке развернуть необязательное значение

1 Ответ

2 голосов
/ 11 апреля 2020

Вы используете неявно развернутый необязательный параметр для schoolListViewModel, но вы не присваиваете значение, пока не выполнится viewDidLoad. Как следует из названия, этот метод выполняется после загрузки представления . Вы ссылаетесь на schoolListViewModel в numberOfRowsInSection, который будет вызван после загрузки представления, но до выполнения viewDidLoad, поэтому вы получите cra sh.

Простое исправление заключается в условном развертывании schoolListViewModel в этом методе:

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