2017-02-15 3 views
1

Я создал табличное представление с 2 ячейками, каждая ячейка показывает оба сенатора (исходя из вашего местоположения). Я использовал CLGeocoder, чтобы успешно захватить zipcode пользователя, и затем помещаю это значение (которое имеет строку типа) в переменную, объявленную вне функции.Как можно изменить данные на основе местоположения пользователя?

В идеале я хочу перейти к другой функции в классе и использовать эту строковую переменную (которая должна содержать почтовый индекс пользователя) для создания определенных данных. Однако это не сработает!

Вот код, который извлекает почтовый индекс и помещает его в var zipCode: (обратите внимание, что функция печати в условии if успешно печатает почтовый индекс в терминале при запуске программы).

let locationManager = CLLocationManager() 

var zipcode: String = "" 

func getTableInfo() { 

    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startMonitoringSignificantLocationChanges() 

    CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in 

     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 

     } 

     if placemarks!.count > 0 { 
      let pm = placemarks![0] 

      self.zipcode = pm.postalCode! 

      print(self.zipcode) 
     } 

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

} 

Я называю эту функцию в viewDidLoad(), а затем в функции viewDidLoad(), используя условный оператор, я пытаюсь использовать почтовый индекс, чтобы изменить массив строк. names[] объявлен как пустой массив строк прямо над функцией viewDidLoad().

if zipcode == "94108" { 
     names[1] = "WORKS!" 
     print(names) 
    } 

По какой-то причине он не печатает имена! (Обратите внимание, что почтовый индекс действительно 94108, потому что 94108 - это то, что печатает на консоли, когда я прошу распечатать «zipcode»)

+0

Где вы выполняя свой ', если почтовый индекс == Заявление «94108»? Вы уверены, что функция CLGeocoder еще не закончена? – creeperspeak

+0

Он успешно работает, когда помещается в функцию CLGeocoder(), но проблема в том, что когда я печатаю имена [] позже в своей программе, имена [1] не выполняются Включить обновленный элемент. –

+0

Право - но 'reverseGeocode' является асинхронной функцией, поэтому есть небольшая задержка в выполнении. Если вы положите оператор if сразу после того, как функция 'reverseGeocode' будет почти наверняка останова, поскольку' reverseGeocode' все еще работает. См. Другие ответы. – creeperspeak

ответ

2

Создать обработчик завершения для вашего метода getTableInfo, как это:

typealias ZipcodeCompletionBlock = (String?) -> Void 

func getTableInfo(completionBlock: @escaping ZipcodeCompletionBlock) { 

    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startMonitoringSignificantLocationChanges() 

    CLGeocoder().reverseGeocodeLocation(locationManager.location!, completionHandler: {(placemarks, error) -> Void in 
     if error != nil { 
      print("Reverse geocoder failed with error" + error!.localizedDescription) 
      completionBlock(nil) 
     } else if placemarks!.count > 0 { 
      let pm = placemarks![0] 
      self.zipcode = pm.postalCode! 
      completionBlock(self.zipcode) 
     } else { 
      print("Problem with the data received from geocoder") 
      completionBlock(nil) 
     } 
    }) 

} 

Теперь вы можете вызвать эту функцию, как этот внутренний viewDidLoad:

self.getTableInfo { zipcode in 
    if zipcode == "94108" { 
     self.names[1] = "WORKS!" 
     print(self.names) 
    } 
} 
0

Возможно, из-за небольшой задержки в выполнении кода, который сохраняет код почтового индекса, поэтому zipcode по-прежнему "", когда выполняется ваш код печати. Обработчики завершения выполняются, потому что они выполняют код ПОСЛЕ выполнения функции. Поставьте следующий код сразу после печати (self.zipcode)

if zipcode == "94108" { 
    names[1] = "WORKS!" 
    print(names) 
} 

Надеюсь, что это поможет!

+0

Итак, теперь имена [] успешно печатают новый вывод на консоли, но почему это работает только в getTableInfo()? Как я могу сделать это так, чтобы он успешно печатался в разных функциях? –

+0

Я бы назвал эти функции изнутри блока завершения, это единственный способ точно знать, что ваш zipcode был успешно установлен. – Trev14

Смежные вопросы