Ios If语句未更改全局变量swift
我试图设置一个函数来获取我在应用程序委托中的当前位置,但当我在底部打印(城市)时,它返回全局变量中的原始初始化值,即“hello”,即使我更新了CLGeocoder下的值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
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)将打印出正确的响应,但是,不能在闭包内返回函数,因此这将不起作用。