2017-05-15 1 views
-2

J'essaie de montrer une carte avec deux marqueurs avec des longitudes et des latitudes qui sont extraites de l'API.charger la latitude et la longitude à partir de l'API avant de charger la carte Swift 3

la fonction qui obtient les longitudes et latitudes est appelé à Viewdidload

override func viewDidLoad() { 
    super.viewDidLoad() 

    getCurrent() 

également le code pour afficher la carte avec des marqueurs en viewdidload donc mon code complet ressemble à quelque chose comme ceci:

var longFamily = "" 
let latFamily = "" 
var latShop = "" 
var longShop = "" 


override func viewDidLoad() { 
    super.viewDidLoad() 

    getCurrent() 
    let coordinate₀ = CLLocation(latitude: CLLocationDegrees(Int(latFamily)!), longitude: CLLocationDegrees(Int(longFamily)!)) 
    let coordinate₁ = CLLocation(latitude: (Int(latFamily)!, longitude: (Int(longFamily)!)) 
    let distanceInMeters = coordinate₀.distance(from: coordinate₁) // result is in meters 
    let floatDistance = Float(distanceInMeters) 


    // get two markers with shop and client locations 



    map.delegate = self 

    // 2. 
    let sourceLocation = CLLocationCoordinate2D(latitude: (Int(latFamily)!, longitude: (Int(longFamily)!) 
    let destinationLocation = CLLocationCoordinate2D(latitude: (Int(latShop)!, longitude: (Int(latShop)!) 

Je sais qu'il y a quelque chose que je dois faire pour obtenir les données avant que la carte ne charge, mais je ne sais pas où. Je vous remercie de votre aide

fonction GetCurrent appelle API:

Alamofire.request(url!, method: .get, parameters: param,encoding: URLEncoding.default, headers: headers).responseJSON { response in 



     if let value: AnyObject = response.result.value as AnyObject? { 
      //Handle the results as JSON 


      let data = JSON(value) 
      self.LongShop = data["shopLong"] 
    // this is for family locations too 
+1

Donc, vous voulez essentiellement pour charger les coordonnées d'une API (non MapKit), avant le chargement de carte afin vous pouvez les afficher? – mcjcloud

+0

@mcjcloud oui l'API me donnera les coordonnées et la carte est (MapKit) est dans la vue – leo0019

+1

IMO c'est juste un problème de conception. Concevez votre application pour afficher un écran de chargement pendant que vous attendez l'appel de l'API, puis, dans le gestionnaire de complétion lorsque vous obtenez le rappel réussi avec les coordonnées géographiques, présentez un nouveau VC avec la carte. De même, vous ne devriez probablement pas utiliser d'entiers pour la latitude et la longitude. – Pierce

Répondre

0

Si vous voulez avoir les coordonnées avant le chargement de carte, vous voulez faire l'appel API avant que la vue est chargé (avant viewDidLoad est appelé). Vous pouvez essayer viewWillAppear, mais en fonction du temps de réponse de l'API, cela peut être peu fiable. Je suggère de faire l'appel à l'API dès que vous avez les données pour le faire. Obtenez param de l'utilisateur ou la source souhaitée avant la main (peut-être dans une autre vue), et le transmettre à la vue de la carte dans la fonction prepareForSegue:

  1. Ajouter une variable globale à la vue de la carte (MapViewController.swift pour exemple)

    class MapViewController { 
        var param: Any? // replace Any with the desired data type 
        /* rest of MapView code */ 
    } 
    
  2. Faire l'appel d'API et passer dans le précédent contrôleur de vue et de le transmettre à la MapViewController

    class PreviousViewController { 
        var param: Any? // replace Any with the desired data type 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
         getFromAPI() // getFromAPI being a function that makes the API call and assigns the param variable 
        } 
    
        func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
         if let dest = segue.destination as? MapViewController { 
          dest.param = self.param 
         } 
        } 
    } 
    

En plus de cela, vous pouvez ajouter des fonctionnalités dans lequel le Segue de MapViewController ne peut être effectuée jusqu'à ce que param n'est pas nil