Диспетчер служб не заполняет ViewModel - PullRequest
0 голосов
/ 10 апреля 2020

привет разработчик щас изучаю mvvm. Я хочу заполнить данные в моей viewModel, и я создаю свой сервис как одиночный. но почему-то это не сработало, по моему uilabel. вместо этого мой uilabel текст исчезает, я не знал, неверна ли моя установка viewModel. Я должен отделить модель, так как у меня есть два объекта модели внутри моей модели представления. здесь я покажу вам мой код.

class ProfileViewModel {

    private var infos: InfoResult?
    private var cities = [City]()
    private var religions = [Religion]()

    private let services: BasicInfoServices

    var profileID: String {
        return infos?.id ?? ""
    }

    var imageURL: String {
        let imageUrl = infos?.docAwsUrl ?? ""
        return imageUrl
    }

    var fullName: String {
        return infos?.fullName ?? ""
    }

    var phoneNumber: String {
        return infos?.phoneNumber ?? ""
    }

    var email: String {
        return infos?.email ?? ""
    }

    var cityOfBirth: String {
        var cityName = ""
        cities.forEach { city in
            if infos?.pobId == city.id {
                cityName = city.name ?? ""
            }
        }
        return cityName
    }

    var dateOfBirth: String {
        return infos?.dob ?? ""
    }

    var religion: String {
        var religionName = ""
        religions.forEach { religion in
            if infos?.religionId == religion.id {
                religionName = religion.name
            }
        }
        return religionName
    }

    init(services: BasicInfoServices) {
        self.services = services
        populateProfile()
    }
}

extension ProfileViewModel {

    func populateProfile() {
        // Basic Info
        self.services.getBasicInfo { [weak self] result in
            switch result {
            case .success(let profile):
                self?.infos = profile
            case .failure(let error):
                print(error)
            }
        }

        // City
        self.services.getCity { [weak self] result in
            switch result {
            case .success(let cities):
                self?.cities = cities
            case .failure(let error):
                print(error)
            }
        }

        // Religion
        self.services.getReligion { [weak self] result in
            switch result {
            case .success(let religions):
                self?.religions = religions
            case .failure(let error):
                print(error)
            }
        }
    }
}

// I initialise it in viewController
    var viewModel: ProfileViewModel!
    var services = BasicInfoServices()

// than I test it in viewDidLoad
    viewModel = ProfileViewModel(services: services)
    profileLbl.text = viewModel.fullName // when set this my profileLbl place holder disappear.
    profileImage.getUserImage(urlString: viewModel.imageURL)

1 Ответ

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

1) В этой строке вы делаете запросы API, так что это асинхронный c процесс

viewModel = ProfileViewModel(services: services)

2) Без ожидания для успешного ответа вы пытаетесь использовать данные ответа в следующей строке

profileLbl.text = viewModel.fullName

Советы для вас

1) Вы должны использовать замыкания для обнаружения API ответы.

class ProfileViewModel {

    var info: InfoResult?
    private let services: BasicInfoServices

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

    func loadData(success: (()->()), failure: ((String)->())){
        self.services.getBasicInfo { [weak self] result in
            switch result {
            case .success(let infoResult):
                self?.info = infoResult
                success()
            case .failure(let error):
                print(error)
                failure(error.localizedDescription)
            }
        }
    }

}

2) После получения данных вы можете показать это в представлении.

class ViewController: UIViewController {

    let viewModel = ProfileViewModel(services: BasicInfoServices())

    @IBOutlet weak var lblProfileID:UILabel!
    @IBOutlet weak var lblFullName:UILabel!
    @IBOutlet weak var lblPhoneNumber:UILabel!
    @IBOutlet weak var lblEmail:UILabel!
    @IBOutlet weak var lblDataOfBirth:UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.viewModel.loadData(success: {
            self.populateUserData()
        }, failure: { errorString in
            print(errorString)
        })

    }

    func populateUserData(){

        self.lblProfileID.text = self.viewModel.info?.id
        self.lblFullName.text = self.viewModel.info?.fullName
        self.lblPhoneNumber.text = self.viewModel.info?.phoneNumber
        self.lblEmail.text = self.viewModel.info?.email
        self.lblDataOfBirth.text = self.viewModel.info?.dob

    }

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