2017-10-15 5 views
1

J'ai un problème que j'essaie de comprendre. Je ne suis pas sûr de ce que serait une façon «élégante» d'aborder cela. C'est mon premier projet Swift, alors excusez-moi si je demande quelque chose de ridicule.Passer une variable d'un UIImagePickerController à d'autres fonctions dans Swift

J'ai ce contrôleur/sélecteur d'image pour obtenir la latitude/longitude d'une photo dans la photothèque d'un utilisateur.

//Get metadata from a photo. Save location (latitude/longitude) 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    let picker = UIImagePickerController() 
    picker.delegate = self // delegate added 


    if let URL = info[UIImagePickerControllerReferenceURL] as? URL { 
     print("We got the URL as \(URL)") 

     let opts = PHFetchOptions() 
     opts.fetchLimit = 1 
     let assets = PHAsset.fetchAssets(withALAssetURLs: [URL], options: opts) 
     for assetIndex in 0..<assets.count { 
      var asset = assets[assetIndex] 
      var location = String(describing: asset.location!) 
      var photo_latitude = asset.location?.coordinate.latitude 
      var photo_longitude = asset.location?.coordinate.longitude 
      var coords : [String: Double] = ["longitude": photo_longitude!, "latitude": photo_latitude!] 
      PHAsset.fetchAssets(withALAssetURLs: [URL], options: nil) 
      dismiss(animated:true, completion: nil) 


      PHImageManager.default() 
       .requestImageData(for: asset, 
            options: nil) { resultData, response, orientation, info in 
            var data = resultData 
            DropboxClientsManager 
             .authorizedClient? 
             .files 
             .upload(path: "/development/image.jpg", mode: .overwrite, input : data!) 
            print(data!) 
       } 

      } 

     } 
    } 
} 

Je télécharge également l'image qu'ils ont sélectionnée dans Dropbox.

Voici mon problème. Je veux obtenir l'adresse de la latitude et de la longitude, mais j'ai besoin d'un moyen de passer la latitude et la longitude dans la fonction appropriée. J'utilise le code suivant avec l'API Google Maps pour trouver une adresse à partir de la latitude et de la longitude.

let baseUrl = "http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true/false" 

let apikey = "hiding_my_api_key" 

func getAddressFromGoogle() { 

    Alamofire.request(baseUrl, method: .get).responseJSON { 
     response in 
     if response.result.isSuccess { 
      print("Successful request.") 

      var locationData = JSON(response.result.value!) 
      let streetAddress = locationData["results", 0, "formatted_address"] 
       print(streetAddress) 
       print(locationData) 

     } 

     else { 
      print("Error \(response.result.error)") 

     } 
    } 

} 

Quelle serait la meilleure façon pour moi de passer photo_longitude et photo_latitude à ma fonction getAddressFromGoogle?

Merci d'avance.

Répondre

2

Le moyen le plus rapide d'approcher cela serait de l'attaquer de front. La latitude et la longitude sont les deux nombres à virgule flottante, et vous les transmettre en général en tant que tel:

func getAddressFrom(lat: Double, long: Double)

Une fois dans la méthode getAddressFrom(_:_:), vous utilisez généralement une instance de number formatter pour convertir chaque Double à un String du le format API de Google attend:

func getAddressFrom(lat: Double, long: Double) { 
    let baseUrl = "http://maps.googleapis.com/maps/api/geocode/json?", urlSuffix = "&sensor=true/false" 
    let numberFormatter = NumberFormatter() 
    numberFormatter.maximumFractionDigits = 6 
    // Do other configuration to get the number formatter to produce the output you need… 

    let numberLat = NSNumber(floatLiteral: lat), numberLong = NSNumber(floatLiteral: long) 

    guard let textLat = numberFormatter.string(from: numberLat), 
      let textLong = numberFormatter.string(from: numberLong) else { 
     // Handle invalid latitude or longitude… 
     return 
    } 
    let completeUrl = baseUrl + textLat + "," + textLong + urlSuffix 

    // Remaining body of function… 
} 

dans la production, vous devez configurer probablement le formatter numéro dans le corps de la classe de réutiliser pour de nombreuses images. En regardant votre contrôleur de sélecteur d'image, je vois que la latitude et la longitude que vous retirez des images sont des valeurs optionnelles, car elles peuvent être ou non nil. Lors de l'appel getAddressFrom(_:_:), vous devrez probablement utiliser optional binding pour déballer les optionals et traiter le cas nil:

guard let photo_latitude = photo_latitude, let photo_longitude = photo_longitude else { 
    // Handle a photo missing latitude, longitude, or both… 
    return 
} 
getAddressFrom(lat: photo_latitude, long: photo_longitude) 

Notez qu'il est rare d'utiliser des noms de variables dans underscores à Swift. photoLatitude et photoLongitude sont plus rapides.

+0

Ah, d'accord. Donc, je devrais appeler getAddressFrom à l'intérieur de mon contrôleur de sélecteur d'image? Cela semble beaucoup plus modulaire, mais je ne suis pas sûr que ce soit ce que vous voulez dire. Aussi, je vais aller avec photoLatitude/photoLongitude. Encore utilisé pour certaines conventions Python. – vipertherapper

+0

@vipertherapper Oui, vous l'appellerez vraisemblablement dans votre boucle 'for' à un moment donné après avoir attribué' photoLatitude' et 'photoLongitude'. –

+1

Je reçois une erreur en utilisant cette ligne: let textLat = numberFormatter.string (de: lat), textLong = numberFormatter.string (de: long) – vipertherapper