2016-05-11 1 views
1

У меня есть внешняя переменная selectCoordinates, которая имеет тип CLLocationCoordinate2D. Этот var должен сохранять координаты из закрытия geocodeAddressString, но, по-видимому, он не изменяется.Почему .geocodeAddressString не изменяет внешнюю переменную?

Я хотел бы обратиться за совет, как сделать это на самом деле закрытие хранения данных, так что я буду иметь возможность разобрать его на другую ViewController

var chooseCoordinates = CLLocationCoordinate2D() 
//////////// 

let geocoder = CLGeocoder() 

    geocoder.geocodeAddressString(sender.text!, completionHandler: { (placemarks, error) -> Void in 

     if(error != nil) { 
      print("\(error)") 
     } 

     if let placemark = placemarks?.first { 
      let coordinates: CLLocationCoordinate2D = placemark.location!.coordinate 
      self.chooseCoordinates = coordinates 
     } 
    }) 

ответ

0

В geocodeAddressString работает асинхронно (т.е. даже если метод возвращается немедленно, его закрытие completionHandler может быть вызвано позже). Итак, вы уверены, что он не меняется или просто не меняется к тому времени, когда вы пытаетесь использовать chooseCoordinates? Вы должны инициировать любое обновление пользовательского интерфейса или что-либо из него в закрытии (или didSet от chooseCoordinates), не делая этого немедленно. Мы не видим, как вы используете chooseCoordinates, поэтому трудно быть более конкретным.

Например:

geocoder.geocodeAddressString(sender.text!) { placemarks, error in 
    if error != nil { 
     print(error!) 
    } 

    if let placemark = placemarks?.first { 
     let coordinates: CLLocationCoordinate2D = placemark.location!.coordinate 
     self.chooseCoordinates = coordinates 
     // call the method that uses `chooseCoordinates` here 
    } 
} 

// don't try to use `chooseCoordinates` here, as it hasn't been set yet. 

Или, вы можете использовать в completionHandler шаблон себя:

@IBAction func didEndEditingTextField(sender: UITextField) { 
    geocodeAddressString(sender.text!) { coordinate, error in 
     self.chooseCoordinates = coordinate 
     // trigger whatever the next step is here, or in the `didSet` of `chooseCoordinates` 
    } 

    // don't try to use `chooseCooordinates` here 
} 

var chooseCoordinates: CLLocationCoordinate2D? // you probably should make this optional 

let geocoder = CLGeocoder() 

/// Geocode string 
/// 
/// - parameter string: The string to geocode. 
/// - parameter completionHandler: The closure that is called asynchronously (i.e. later) when the geocoding is done. 

func geocodeAddressString(string: String, completionHandler: (CLLocationCoordinate2D?, NSError?) ->()) { 
    geocoder.geocodeAddressString(string) { placemarks, error in 
     if error != nil { 
      print(error!) 
     } 

     if let placemark = placemarks?.first { 
      completionHandler(placemark.location!.coordinate, error) 
     } else { 
      completionHandler(nil, error) 
     } 
    } 
} 
+0

Спасибо! Я использовал первый в своем другом контроллере представления, и он работал, поэтому речь шла о синхронизации. –