SwiftUI-如何从视图模型调用完成函数

squarehippo10

我有一个获取邮政编码并将其传递给方法的表格。该方法查找城市和州,并将信息作为元组返回。该方法还具有完成处理程序,以便在找到城市和州之前不会保存其余表单数据。

我将函数移到视图模型中以使事情井井有条,但是现在我很困惑。首先,必须在函数返回之前调用完成处理程序,即使这与我想要的完全相反。我想获取城市和州的值,然后通过处理程序保存它们。我的困惑的后半部分是函数的调用。如果我分配一个变量,例如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)
} 

设置视图

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!
}
pawello2222

返回citystate在完成处理程序中,而不是在中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))
   }
} 

然后,您可以执行以下操作:

settingsVM.getCityStateFromPostalCode(zip: companyZip) { city, state in
   let newCompany = Company(context: self.moc)
   newCompany.id = UUID()
   newCompany.city = city
   newCompany.state = state
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章