【问题标题】:load latitude and longitude from API before map loads Swift 3在地图加载Swift 3之前从API加载纬度和经度
【发布时间】:2017-05-15 19:34:25
【问题描述】:

我正在尝试显示带有两个标记的地图,这些标记具有从 API 检索到的经度和纬度。

获取经纬度的函数在Viewdidload中调用

 override func viewDidLoad() {
    super.viewDidLoad()

    getCurrent()

还有在viewdidload 中显示带有标记的地图的代码,所以我的完整代码如下所示:

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

我知道在地图加载之前我必须做一些事情来获取数据,但不确定在哪里。非常感谢您的帮助

GetCurrent 函数调用 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  

【问题讨论】:

  • 所以您基本上是想在地图加载之前从 API(而不是 MapKit)加载坐标以便显示它们?
  • @mcjcloud 是的,API 会给我坐标并且地图(MapKit)在视图中
  • IMO 这只是一个设计问题。设计您的应用程序以在您等待 API 调用返回时显示加载屏幕,然后在完成处理程序中,当您使用地理坐标成功回调时,使用地图呈现一个新的 VC。此外,您可能不应该将整数用于纬度和经度。
  • 谢谢我解决了加载问题。现在,正如您刚才提到的,我对纬度和经度有疑问,因为 Int 没有将位置放在正确的位置。什么是最好的转换?或者如何将我的字符串从 API 转换为有效的纬度和经度

标签: ios swift xcode viewdidload cllocationcoordinate2d


【解决方案1】:

如果您想在地图加载之前获得坐标,您需要在加载视图之前调用 API(在调用 viewDidLoad 之前)。您可以尝试viewWillAppear,但根据 API 的响应时间,这可能不可靠。我建议您在获得数据后立即调用 API。事先从用户或所需来源(可能在不同的视图中)获取param,并将其传递给prepareForSegue 函数中的地图视图:

  1. 为地图视图添加一个全局变量(例如 MapViewController.swift)

    class MapViewController {
        var param: Any?    // replace Any with the desired data type
        /* rest of MapView code */
    }
    
  2. 进行API调用,传入之前的ViewController,传给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
            }
        }
    }
    

除此之外,您还可以添加在 param 不是 nil 之前无法执行 MapViewController segue 的功能

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多