ios - 服务管理器未填充ViewModel

标签 ios swift mvvm

您好,开发人员,我现在学习mvvm。我想在viewModel中填充数据,然后将我的服务创建为单例。但在我的uilabel中,它以某种方式不起作用。相反,我的uilabel文本消失了,我不知道我的安装viewModel是否错误。我应该分开模型,因为我的 View 模型中有两个模型对象。在这里,我向您展示我的代码。

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)在这一行,您发出API请求,因此这是一个异步过程
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)接收数据后,可以在 View 上显示它。
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

    }

}

关于ios - 服务管理器未填充ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61137497/

相关文章:

ios - 使用换行符附加 NSAttributedString 会返回格式错误的属性字符串

ios - SBJson iOS 解析器方法已弃用?

ios - 加载 XIB 此类与键的键值编码不兼容

c# - 如何编辑 “ComboBoxItem”?

wpf - 如何在 ViewModel 中播放 Storyboard?

ios - 在 Xcode 6 中使用前缀文件时出错

ios - 水平滚动时 ScrollView 的默认方法是什么?

xcode - 检测弹出窗口关闭

arrays - 将对象添加到 [String : [[String]]] dictionary

c# - 如何在 Caliburn.Micro 2 中使用自定义窗口?