CLGeocoding, сталкивается с проблемой при обратном геокодировании и получении адреса из LAT LONG для отображения в tableView

Я новый Свифт. У меня есть задача, которую нужно выполнить. Я получаю ответ от сервера, где я получаю числа широты и долготы.

    {
        EndLat = "28.511593";
        EndtLong = "77.071136";
    },
    {
        EndLat = "28.511593";
        EndtLong = "77.071136";
    },.....

получение этого типа ответа, имеющего более 100 записей.

Теперь, когда я получаю адрес с помощью обратного геокодирования..

func getAddressForLogOut(pdblLatitude: String, withLongitude pdblLongitude: String) {

            if (pdblLatitude != "") && (pdblLongitude != "") {

                var center : CLLocationCoordinate2D = CLLocationCoordinate2D()
                let lat: Double = Double("\(pdblLatitude)")!
                //21.228124
                let lon: Double = Double("\(pdblLongitude)")!
                //72.833770
                let ceo: CLGeocoder = CLGeocoder()
                center.latitude = lat
                center.longitude = lon

                let loc: CLLocation = CLLocation(latitude:center.latitude, longitude: center.longitude)

                ceo.reverseGeocodeLocation(loc, completionHandler:
                    {(placemarks, error) in
                        if (error != nil)
                        {
                            print("reverse geodcode fail: \(error!.localizedDescription)")
                        }
                        let pm = placemarks! as [CLPlacemark]

                        if pm.count > 0 {
                            let pm = placemarks![0]
                            print(pm.country)
                            print(pm.locality)
                            print(pm.subLocality)
                            print(pm.thoroughfare)
                            print(pm.postalCode)
                            print(pm.subThoroughfare)
                            var addressString : String = ""
                            if pm.subLocality != nil {
                                addressString = addressString + pm.subLocality! + ", "
                            }
                            if pm.thoroughfare != nil {
                                addressString = addressString + pm.thoroughfare! + ", "
                            }
                            if pm.locality != nil {
                                addressString = addressString + pm.locality! + ", "
                            }
                            if pm.country != nil {
                                addressString = addressString + pm.country! + ", "
                            }
                            if pm.postalCode != nil {
                                addressString = addressString + pm.postalCode! + " "
                            }
                            print(addressString)
                            self.endAdd = addressString
                            print("self.endAdd is",self.endAdd)
                        }
                } )
            }
        }

Я использую эту функцию в функции tableView cellForRowAtIndexPath. когда я прокручиваю таблицу, приложение вылетает. получение нуля на метке!

пусть pm = метки! как [CLPlacemark] в этой строке.

Может ли кто-нибудь помочь мне использовать обратное геокодирование, которое позволило мне получить адрес с более чем 100 широтой и долготой и отобразить его в tableView.


person azeem usmani    schedule 08.12.2019    source источник
comment
какой сбой ////// ?   -  person Sh_Khan    schedule 08.12.2019
comment
получить ноль в метках пусть pm = метки! как [CLPlacemark] в этой строке   -  person azeem usmani    schedule 08.12.2019
comment
programmingios.net/what-asynchronous-means   -  person matt    schedule 08.12.2019
comment
Вы не можете вызвать свой метод в cellForRow. Ваш метод асинхронный. Ячейка уже была возвращена до того, как произошло геокодирование.   -  person matt    schedule 08.12.2019


Ответы (1)


CLGeocoder возвращает необязательный тип:

typealias CLGeocodeCompletionHandler = ([CLPlacemark]?, Error?) -> Void

(из документа)

Вы должны проверить это.

Я думаю, что использовать ячейку для загрузки данных из геокодера — плохая идея, потому что у вас будет гонка:

  1. Запрос на запуск1(широта1,долгота1)
  2. повторное использование ячейки
  3. начать запрос2 (широта2, долгота2)
  4. ответ геокодера на request1

В 4) ячейка показывает противоречивые данные.

person chchrn    schedule 08.12.2019