Пользовательский интерфейс не обновляется в viewController MVVM - PullRequest
1 голос
/ 02 апреля 2020

Я учу MVVM по-быстрому. Я правильно настроил viewModel, но пользовательский интерфейс не обновляется, что пошло не так, на самом деле я сделал сервисы параметром сервиса singleton? это мой код установки

class UserViewModel {

    private var user: GTUser?
    let service: UserService

    var id: String {
        return user?.userId ?? ""
    }

    var userName: String {
        return user?.fullName ?? ""
    }

    var imageUrl: String {
        return user?.docAwsUrl ?? ""
    }

    init(service: UserService) {
        self.service = service
        populateUser()
    }

    private func populateUser() {
        service.getUserData { result in
            switch result {
            case .success(let user):
                self.user = user
                print(self.user)
            case .failure(let error):
                print(error)
            }
        }
    }
}

let services = UserService()
var viewModel: UserViewModel!

override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white
        setupNavigation()
        configure()

        viewModel = UserViewModel(service: services)

        DispatchQueue.main.async {
            self.profileImage.getUserImage(urlString: self.viewModel.imageUrl)
            self.profileLbl.text = self.viewModel.userName
        }
    }

Я уже пробовал использовать dispatchQueue, но все еще не работает

1 Ответ

1 голос
/ 02 апреля 2020

Ваша private func populateUser() функция - Asyn c, поэтому при попытке доступа к self.profileImage.getUserImage(urlString: self.viewModel.imageUrl) из viewDidLoad она может быть недоступна,

. Чтобы исправить это, вы можете закрыть обработчик завершения в функцию, при успехе и неудаче вызовите обработчик завершения, чтобы после выполнения операции

как

ваше удовольствие от инициации c будет закрыто

init(service: UserService,completion:(Bool) -> ()) {
    self.service = service
    populateUser(completion)
}

и

private func populateUser(_ completion:(Bool) -> ()) {
   service.getUserData { result in
        switch result {
        case .success(let user):
            self.user = user
            print(self.user)
            completion(true)
        case .failure(let error):
            print(error)
           completion(false)
        }
    }
}

и сейчас

 viewModel = UserViewModel(service: services){[unowned self] (success) in
        //Check success if you want !!
        self.profileImage.getUserImage(urlString: self.viewModel.imageUrl)
        self.profileLbl.text = self.viewModel.userName
    }            

Надеюсь, что это полезно

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