squ*_*o10 5 viewmodel completionhandler swift swiftui
我有一个获取邮政编码并将其传递给方法的表单。该方法查找城市和州,并将信息作为元组返回。该方法还有一个完成处理程序,以便在找到城市和州之前不会保存其余的表单数据。
我将函数移至视图模型以保持秩序,但现在我很困惑。首先,必须在函数返回之前调用完成处理程序,尽管这似乎与我想要的完全相反。我想获取城市和州的值,然后我想通过处理程序保存它们。我困惑的后半部分是函数的调用。如果我分配一个变量,例如cityState
从我的方法接收元组,则保存发生在我无法访问的闭包中!(请参阅下面的设置查看代码。)
我可以将所有内容移回正常工作的视图。但我试图了解 MVVM 应该如何工作。
设置视图模型
func getCityStateFromPostalCode(zip: String, completion: @escaping () -> ()) -> (String, String) {
let geocoder = CLGeocoder()
var city = ""
var state = ""
geocoder.geocodeAddressString(zip) { (placemarks, error) in
if let placemark = placemarks?[0] {
if placemark.postalCode == zip {
city = placemark.locality!
state = placemark.administrativeArea!
}
}
completion()
}
return (city, state)
}
Run Code Online (Sandbox Code Playgroud)
设置视图
let settingsVM = SettingsViewModel()
let cityState = settingsVM.getCityStateFromPostalCode(zip: companyZip) {
let newCompany = Company(context: self.moc)
newCompany.id = UUID()
newCompany.city = ?? //can't use cityState here.
newCompany.state = ?? // or here!
}
Run Code Online (Sandbox Code Playgroud)
返回city
并state
在完成处理程序中,而不是在return
:
func getCityStateFromPostalCode(zip: String, completion: @escaping ((String, String)) -> ()) {
let geocoder = CLGeocoder()
var city = ""
var state = ""
geocoder.geocodeAddressString(zip) { (placemarks, error) in
if let placemark = placemarks?[0] {
if placemark.postalCode == zip {
city = placemark.locality!
state = placemark.administrativeArea!
}
}
completion((city, state))
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
settingsVM.getCityStateFromPostalCode(zip: companyZip) { city, state in
let newCompany = Company(context: self.moc)
newCompany.id = UUID()
newCompany.city = city
newCompany.state = state
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3134 次 |
最近记录: |