2015-02-23 2 views
3

Я передаю набор координат широты и долготы для обратного геокодирования. Обратное геокодирование работает, и я возвращаю свои данные адреса, но затем мне нужно создать URL-адрес из этих данных, что я делаю дальше. Я обнаружил, что NSURLSession выполняется до того, как я верну свои данные. Вы можете видеть, где я помещаю в println, чтобы отображать «первый» и «второй», но в выходной консоли, когда я выполняю этот код, отображается «второй», а затем «первый» вместе с адресными данными, что говорит мне, m не работает в порядке.Выполнение синхронного кода в Swift

Как я могу заставить порядок выполнения, требуя, чтобы моя переменная addchunk существовала до запуска NSURLSession?

Спасибо!

@IBAction func grabData(sender: UIButton) { 
    var latitude:CLLocationDegrees = (latitudeEntry.text as NSString).doubleValue 
    var longitude:CLLocationDegrees = (longitudeEntry.text as NSString).doubleValue 
    var location = CLLocation(latitude: latitude, longitude: longitude) 

    // reverse geocodes the supplied latitude and longitude 
    CLGeocoder().reverseGeocodeLocation(location, completionHandler: { 
     (placemarks, error) -> Void in 
     if error != nil { 
      println("Reverse geocoder failed with error" + error.localizedDescription) 
     } 
     if placemarks.count > 0 { 
      let pm = placemarks[0] as CLPlacemark 
      self.addchunk = "\(pm.subThoroughfare)-\(pm.thoroughfare),-\(pm.locality),-\(pm.administrativeArea)".lowercaseString 
      println("first " + self.addchunk) 
     } else { 
      println("Problem with the data received from geocoder") 
     } 
    }) 

    var url = NSURL(string: "http://www.example.com/" + addchunk) 
    println("second " + addchunk) 
    if url != nil { 
     let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { 
      (data, response, error) -> Void in 
    ... 
+0

почему бы не перенести код URL-адрес в обработчик завершения обратного GeocodeLocation? – chris

+0

Да, назовите этот код из 'completeHandler'. Мы можем показать вам, как сделать это синхронно (и, я уверен, кто-то будет), но это ужасный образец. Никогда не блокируйте основную очередь. Вызовите код, зависящий от результатов «reverseGeocodeLocation» из «completeHandler». – Rob

+0

Спасибо, Крис и Роб! Хороший вопрос о том, чтобы не блокировать основную очередь. –

ответ

2

Update вы код, как это:

var latitude:CLLocationDegrees = ("-34.4232722" as NSString).doubleValue 
    var longitude:CLLocationDegrees = ("150.8865837" as NSString).doubleValue 
    var location = CLLocation(latitude: latitude, longitude: longitude) 

    // reverse geocodes the supplied latitude and longitude 
    CLGeocoder().reverseGeocodeLocation(location, completionHandler: { 
     (placemarks, error) -> Void in 
     if error != nil { 
      println("Reverse geocoder failed with error" + error.localizedDescription) 
     } 
     if placemarks.count > 0 { 
      let pm = placemarks[0] as CLPlacemark 
      self.addchunk = "\(pm.subThoroughfare)-\(pm.thoroughfare),-\(pm.locality),-\(pm.administrativeArea)".lowercaseString 
      println("first " + self.addchunk) 
     } else { 
      println("Problem with the data received from geocoder") 
     } 
     var url = NSURL(string: "http://www.example.com/" + self.addchunk) 
     println("second " + self.addchunk) 
     if url != nil { 
      let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { 
       (data, response, error) -> Void in 
      }) 
     } 
    }) 

Я испытал это, и его работу fine.and это выход для моих координат:

first 18-hercules street,-wollongong,-nsw 
second 18-hercules street,-wollongong,-nsw 
Смежные вопросы