2016-06-15 2 views
0

Хорошо, я не понимаю. Я написал код для прямого геокодирования, у меня есть UITextField, который вы пишете имя города, и после нажатия кнопки ввода его отклоняют, и в то же время вызывается функция, чтобы определить, содержит ли UITextField допустимый ввод. Если есть ошибка, она сохраняется в переменной bool, значение которой изменяется в функции. У меня есть инструкции печати по всему месту, и с выхода на консоли я вижу, что функция запускается после условия if, но она вызывается раньше ... что? Может кто-нибудь объяснить мне, что происходит? Код:Функция запускается после блока кода, даже если она вызывается до

var locationError: Bool? 

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    self.view.endEditing(true) 

    forwardGeocoding(textField.text!) 
    print("forward geocoding ran 1st time") 

    print(locationError) 
    if locationError == true { 
     print("Error") 
    } else if locationError == false { 
     print("Success") 
    } else if locationError == nil { 
     print("No value for locationError") 
    } 

    return false 
} 

func forwardGeocoding(address: String) -> CLLocation? { 
    var userLocation: CLLocation? 
    CLGeocoder().geocodeAddressString(address, completionHandler: { (placemarks, error) in 
     if error != nil { 
      print("Geocoding error: \(error)") 
      self.locationError = true 
      return 
     } 
     if placemarks?.count > 0 { 
      print("Placemark found") 
      self.locationError = false 
      let placemark = placemarks?.first 
      let location = placemark?.location 
      let coordinate = location?.coordinate 
      print("Settings location: \(coordinate!.latitude), \(coordinate!.longitude)") 
      if let unwrappedCoordinate = coordinate { 
       let CLReadyLocation: CLLocation = CLLocation(latitude: unwrappedCoordinate.latitude, longitude: unwrappedCoordinate.longitude) 
       userLocation = CLReadyLocation 
      } 
     } 
    }) 
    return userLocation 
} 

Консоль вывода:

forward geocoding ran 1st time 
nil 
No value for locationError 
Placemark found 
Settings location: 48.8567879, 2.3510768 
+0

Это часть догадки с моей стороны, но я думаю, причина в том, что это происходит потому, что код в функции находится в замыкании, что заставляет его работать асинхронно с остальной частью кода. Попробуйте помещать печать над переменной userLocation в функции и посмотреть, что произойдет. –

+0

Что такое «метки»? Это массив? – Dershowitz123

ответ

0

Попробуйте много поточность это ...

let queue = NSOperationQueue() 
    queue.addOperationWithBlock() { 
      NSOperationQueue.mainQueue().addOperationWithBlock() { 
    } 
} 
0

Вам нужно добавить обработчик завершения в качестве параметра функции:

func forwardGeocoding(address: String, completionHandler: (placemarks: String? or [Array of any type], error: NSError?) ->()) -> CLLocation?

модифицировать, если блок:

if error != nil { 
      print("Geocoding error: \(error)") 
      self.locationError = true 
      completionHandler(nil, error) 
      return 
     } 

затем вызвать его как

forwardGeocoding(textField.text!){(placemarks, error) in 
//your code. 

} 
0

При вызове geocodeAddressString, она выполняется в отдельном потоке (#AppleDoc This method submits the specified location data to the geocoding server asynchronously and returns). Таким образом, у вас есть 2 потока, работающих параллельно. geocodeAddressString в потоке 2 займет больше времени, так как он вызывает вызов сервера, и блок будет выполнен, когда вызов будет возвращен. В течение этого времени поток 1 завершит выполнение и распечатает записи журнала.

Если вы хотите справиться с этой проблемой, логика locationError if-else должна быть реализована таким образом, чтобы она срабатывала после выполнения вашего обратного вызова.