2017-05-09 10 views
0

私は現在の場所をアプリケーションデリゲートで取得しようとしていますが、print(city)が底面にあるときは、元の初期化された値が "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] 
    } 

答えて

1

ジオコーディングが非同期に行われるため、ジオコーディングが完了する前に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") 
     } 
    }) 
} 

だからではなく、他の答えのようgetLocation()コール

getLocation { (location) in 

    print(location) 
} 
0

reverseGeocodeLocation非同期に動作しますので、それが終了する前print文は実際に起こっています。結果に依存するロジックがある場合は、おそらく完了ハンドラのクロージャの内側に配置する必要があります。

0

を呼び出すのではreverseGeocodeLocation、言うあなたのような、クロージャ内print(city)を移動することもできますので、非同期で動作します

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

クロージャ内のプリント(市)を移動すると正しい応答が出力されますが、クロージャ内で関数を返すことはできません。これは機能しません。 –

1

ここで問題となるのは、新しい場所の値が割り当てられる前に値が取得されていることです。あなたは更新された価値を得るために少し待たなければなりません。

関連する問題