Ios If语句未更改全局变量swift

Ios If语句未更改全局变量swift,ios,swift,clgeocoder,Ios,Swift,Clgeocoder,我试图设置一个函数来获取我在应用程序委托中的当前位置,但当我在底部打印(城市)时,它返回全局变量中的原始初始化值,即“hello”,即使我更新了CLGeocoder下的值 AppDelegate: import UIKit import CoreData import CoreLocation let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate var

我试图设置一个函数来获取我在应用程序委托中的当前位置,但当我在底部打印(城市)时,它返回全局变量中的原始初始化值,即“hello”,即使我更新了CLGeocoder下的值

AppDelegate:

    import UIKit
    import CoreData
    import CoreLocation

    let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate

    var country = "hello"
    var city = "hello"

 func setupLocationManager(){
        let locationManager = CLLocationManager()
        locationManager.requestAlwaysAuthorization()
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }

    // Below method will provide you current location.
    func getLocation() -> [String]{
        let manager = CLLocationManager()
        manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        manager.requestAlwaysAuthorization()
        manager.startUpdatingLocation()

        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestAlwaysAuthorization()
        manager.startUpdatingLocation()

        let selflocation = manager.location

        let latitude: Double = selflocation!.coordinate.latitude
        let longitude: Double = selflocation!.coordinate.longitude


        print("current latitude :: \(latitude)")
        print("current longitude :: \(longitude)")

        let location = CLLocation(latitude: latitude, longitude: longitude) //changed!!!            

        CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in
            print(location)

            if error != nil {
                print("Reverse geocoder failed with error" + (error?.localizedDescription)!)
            }

            let pm = placemarks![0]
            let speed = (selflocation?.speed)!
            city = pm.addressDictionary!["City"]! as! String
            country = pm.addressDictionary!["Country"]! as! String

            if (placemarks?.count)! > 0 {
            }
            else {
                print("Problem with the data received from geocoder")
            }
        })

        print(city)
        return [city as! String, country as! String]
    }

reversegeocolocation
是异步工作的,因此
print
语句实际上是在完成之前发生的。如果您有任何依赖于结果的逻辑,则可能需要将其放入完成处理程序闭包中。

reverseGeocodeLocation
异步工作,因此
print
语句实际上是在完成之前发生的。如果您有任何依赖于结果的逻辑,则可能需要将其放入完成处理程序闭包中。

这是因为地理编码是异步完成的,因此在地理编码完成之前执行
打印(城市)
。所以我建议你这样做

func getLocation(completion: @escaping (Array<String>)->()){

    let manager = CLLocationManager()

    manager.desiredAccuracy = kCLLocationAccuracyBest

    manager.requestAlwaysAuthorization()

    manager.startUpdatingLocation()

    let selflocation = manager.location

    let latitude: Double = selflocation!.coordinate.latitude

    let longitude: Double = selflocation!.coordinate.longitude

    let location = CLLocation(latitude: latitude, longitude: longitude)

    CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in

        if let error = error {

            print(error.localizedDescription)

            return
        }

        if let placemark = placemarks?.first {

            if let country = placemark.country, let city = placemark.locality {

                completion([city, country])

                return

            } else {

                print("country or city was nil.")
            }
        } else {

            print("Problem with the data received from geocoder")
        }
    })
}

这是因为地理编码是异步完成的,所以在地理编码完成之前执行
print(city)
。所以我建议你这样做

func getLocation(completion: @escaping (Array<String>)->()){

    let manager = CLLocationManager()

    manager.desiredAccuracy = kCLLocationAccuracyBest

    manager.requestAlwaysAuthorization()

    manager.startUpdatingLocation()

    let selflocation = manager.location

    let latitude: Double = selflocation!.coordinate.latitude

    let longitude: Double = selflocation!.coordinate.longitude

    let location = CLLocation(latitude: latitude, longitude: longitude)

    CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in

        if let error = error {

            print(error.localizedDescription)

            return
        }

        if let placemark = placemarks?.first {

            if let country = placemark.country, let city = placemark.locality {

                completion([city, country])

                return

            } else {

                print("country or city was nil.")
            }
        } else {

            print("Problem with the data received from geocoder")
        }
    })
}

正如另一个答案所说,
reversegeocolocation
是异步工作的,因此您可能希望在闭包内移动
print(city)
,例如在

else {
    print("Problem with the data received from geocoder")
}

正如另一个答案所说,
reversegeocolocation
是异步工作的,因此您可能希望在闭包内移动
print(city)
,例如在

else {
    print("Problem with the data received from geocoder")
}

这里的问题是,在为其指定新的位置值之前,您将获得该值。您必须等待一段时间才能获得更新的值

这里的问题是,在为其指定新的位置值之前,您将获得该值。您必须等待一段时间才能获得更新的值

在闭包内移动print(city)将打印出正确的响应,但是,不能在闭包内返回函数,因此这将不起作用。在闭包内移动print(city)将打印出正确的响应,但是,不能在闭包内返回函数,因此这将不起作用。