我有这个函数,我想用在dataTask函数中得到的纬度/经度数据填充locations数组。
问题是,数据只在datatask函数中可用,而在它之外,它将消失。

func getFromDatabase()
{
    var locations: [CLLocationCoordinate2D] = []
    let url = URL(string: URL_DATABASESend)

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        //Here I print the JSON: print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!)
        do{
            if(data != nil){
               let parsedData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:String]]
                    for dic in parsedData! {
                    if let lat = Double(dic["latitude"]!), let long = Double(dic["longitude"]!) {
                        //print(lat)
                        //print(long)
                        var coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long)
                        locations.append(coordinatesToAppend)
                    }
                }
            }} catch let error as NSError{
            print(error.localizedDescription)
            return
        }
    }
    task.resume()
}

我不知道如何使用completionhandler,当我使用completionhandler时,我会遇到很多错误(我遵循了很多教程/在线帮助主题)。
有人知道如何从函数中获取信息吗?(无法返回值,因为我正在使用datatask)我阅读了很多主题,但没有一个解决我的问题。
希望听到你们的消息!

最佳答案

您需要使用回调从闭包中获取内容。
你的内容是这个数组:var locations: [CLLocationCoordinate2D]所以我们将使用这样的回调:

completion: @escaping ([CLLocationCoordinate2D])->()

我们将其添加到方法签名中:
func getFromDatabase(completion: @escaping ([CLLocationCoordinate2D])->())

然后,我们在内容准备好的代码中使用它,就在循环之后:
func getFromDatabase(completion: @escaping ([CLLocationCoordinate2D])->())
{
    var locations: [CLLocationCoordinate2D] = []
    let url = URL(string: URL_DATABASESend)

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        do {
            if data != nil {
                let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [[String:String]]
                for dic in parsedData {
                    if let lat = Double(dic["latitude"]!), let long = Double(dic["longitude"]!) {
                        let coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long)
                        locations.append(coordinatesToAppend)
                    }
                }
                // Here the array is ready, we use the completion handler
                completion(locations)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
            return
        }
    }
    task.resume()
}

然后使用这样的尾随闭包调用方法以取回数组:
getFromDatabase { (locs) in
    // Here "locs" is your [CLLocationCoordinate2D] array
    print(locs)
}

07-24 21:41