SwiftUI - Comment appeler la fonction avec complétion à partir du modèle de vue


squarehippo10

J'ai un formulaire qui obtient un code postal et le transmet à une méthode. La méthode recherche la ville et l'état et renvoie les informations sous forme de tuple. La méthode dispose également d'un gestionnaire d'achèvement afin que le reste des données du formulaire ne soit pas enregistré tant que la ville et l'état ne sont pas trouvés.

J'ai déplacé la fonction vers un modèle de vue pour garder les choses en ordre, mais maintenant je suis confus. Tout d'abord, le gestionnaire de complétion doit être appelé avant le retour de la fonction, même si cela semble exactement le contraire de ce que je veux. Je veux obtenir les valeurs de la ville et de l'état, puis je veux les enregistrer via le gestionnaire. La seconde moitié de ma confusion réside dans l'appel de la fonction. Si j'assigne une variable comme cityStatepour recevoir le tuple de ma méthode, la sauvegarde se produit dans une fermeture à laquelle je ne peux pas accéder! (Voir Paramètres Afficher le code ci-dessous.)

Je pouvais tout ramener à la vue où cela fonctionnait très bien. Mais j'essaie de comprendre comment MVVM est censé fonctionner.

Paramètres Afficher le modèle

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)
} 

ParamètresAfficher

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

Retourne cityet statedans le gestionnaire de complétion, pas dans le 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))
   }
} 

Ensuite, vous pouvez faire:

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

Articles connexes