Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用Alamofire的同步请求_Swift_Alamofire - Fatal编程技术网

Swift 使用Alamofire的同步请求

Swift 使用Alamofire的同步请求,swift,alamofire,Swift,Alamofire,我已经检查了其他解决方案,例如,我按照所有说明进行了操作,但我无法完成请求,然后使用信息 我需要从谷歌地图中检索距离和路线点,然后用这些信息完成一个数组。 这就是功能: func getGoogleMapsInfo(startLocation: CLLocationCoordinate2D, restaurant: Customer, completion: @escaping (_ distance: Int, _ routePoints: String) -> ()){ l

我已经检查了其他解决方案,例如,我按照所有说明进行了操作,但我无法完成请求,然后使用信息

我需要从谷歌地图中检索距离和路线点,然后用这些信息完成一个数组。 这就是功能:

func getGoogleMapsInfo(startLocation: CLLocationCoordinate2D, restaurant: Customer, completion: @escaping (_ distance: Int, _ routePoints: String)  -> ()){

    let endLocation = CLLocationCoordinate2D(latitude: restaurant.latitude, longitude: restaurant.longitude)
    let origin = "\(startLocation.latitude),\(startLocation.longitude)"
    let destination = "\(endLocation.latitude),\(endLocation.longitude)"
    var distance = 0
    var routePoints = ""

    let url = "https://maps.googleapis.com/maps/api/directions/json?origin=\(origin)&destination=\(destination)&mode=walking"
    Alamofire.request(url).responseJSON { response in

        switch response.result {
        case .success:

            do {
                self.json = try JSON(data: response.data!)

                distance = Int(truncating: self.json["routes"][0]["legs"][0]["distance"]["value"].numberValue)


                let route = self.json["routes"].arrayValue.first
                let routeOverviewPolyline = route!["overview_polyline"].dictionary
                routePoints = (routeOverviewPolyline?["points"]?.stringValue)!
                completion(distance, routePoints)
                break
            } catch {
                print("error JSON")
            }


        case .failure(let error):
            print(error)
            completion(distance, routePoints)
            break
        }

    }


}
我这样称呼它:

    for index in 0...nearbyRestaurants.count - 1 {

        getGoogleMapsInfo(startLocation: currentLocation, restaurant: nearbyRestaurants[index]) { (distance, routePoints) in
            nearbyRestaurants[index].distance = distance
            nearbyRestaurants[index].routePoints = routePoints
        }

    } 

如果有人能帮助我,我将不胜感激。

不要试图提出异步请求

而是使用DispatchGroup,在所有网络请求完成时调用notify

let group = DispatchGroup()
for index in 0..<nearbyRestaurants.count {
    group.enter()
    getGoogleMapsInfo(startLocation: currentLocation, restaurant: nearbyRestaurants[index]) { (distance, routePoints) in
        nearbyRestaurants[index].distance = distance
        nearbyRestaurants[index].routePoints = routePoints
        group.leave()
    }
}
group.notify(queue: DispatchQueue.main) {
        print("all info data has been received")
} 

不要试图使异步请求同步

而是使用DispatchGroup,在所有网络请求完成时调用notify

let group = DispatchGroup()
for index in 0..<nearbyRestaurants.count {
    group.enter()
    getGoogleMapsInfo(startLocation: currentLocation, restaurant: nearbyRestaurants[index]) { (distance, routePoints) in
        nearbyRestaurants[index].distance = distance
        nearbyRestaurants[index].routePoints = routePoints
        group.leave()
    }
}
group.notify(queue: DispatchQueue.main) {
        print("all info data has been received")
} 

检查了其他解决方案,如如何使用Alamofire发出同步请求?不要检查它们。从不同步建立网络。从不我提到过“从未”吗?@matt从后台线程发出同步网络请求是可以的。@Cristik我提到过,除非你已经在后台线程中?@matt我可能在某个地方见过:检查过其他解决方案,如如何使用Alamofire发出同步请求?不要检查它们。从不同步建立网络。从不我提到过“从未”吗?@matt同步网络请求在后台线程中没有问题。@Cristik我提到过,除非你已经在后台线程中?@matt我可能在某个地方见过: