您好,开发人员,我现在学习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/