Метод делегата didUpdateLocations вызывается после попытки использовать данные, которые еще не были извлечены из самого себя - Xcode Swift - PullRequest
0 голосов
/ 02 марта 2019

У меня есть объект NS (называемый GoogleSearch), который я использую для получения данных о местоположении пользователя.Вот некоторые глобальные переменные и функция init:

let locationManager = CLLocationManager()
var coordinates: CLLocationCoordinate2D?

override init() {
    super.init()
    print("1")
    DispatchQueue.main.async {
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
        if CLLocationManager.locationServicesEnabled() {
            self.locationManager.startUpdatingLocation()
        }
    }

}

Далее, вот мой метод делегата:

extension GoogleSearch: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("2")
    let userLocation: CLLocation = locations[0] as CLLocation
    self.coordinates = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
}
}

Далее я пытаюсь получить доступ к координатам (заданным в делегатеметод) в более поздней функции:

func searchForPlaces(completion: @escaping ([place])->()) {
    print(coordinates)
}

Наконец, в ViewController , который я реализую NSobject , у меня есть следующий код в viewDidLoad:

self.googleSearch = GoogleSearch()
    DispatchQueue.main.async {
        self.googleSearch.searchForPlaces(completion: { (places) in
            DispatchQueue.main.async {
                self.places = places
                self.placesCollectionView.reloadData()
            }
        })
    }

Проблема в том, что при печати координат в функциях searchForPlaces печатается ноль, потому что он запускается до вызова метода делегата.Что-то, что я должен изменить в своем NSObject или, возможно, в моем ViewController, чтобы обеспечить мне доступ к координатам из searchForPlaces ()?

Спасибо.

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете достичь таким образом:

class GoogleSearch:NSObject {

  let locationManager = CLLocationManager()
  var coordinates: CLLocationCoordinate2D?
  var completionHandler: ((CLLocationCoordinate2D) -> Void)?

  override init() {
      super.init()
      print("1")

    }

   func searchForPlaces(completion: @escaping (CLLocationCoordinate2D) -> Void) {
     self.completionHandler = completion
     self.locationManager.delegate = self
     self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
     if CLLocationManager.locationServicesEnabled() {
        self.locationManager.stopUpdatingLocation()
        self.locationManager.startUpdatingLocation()
     }
   }
}


extension GoogleSearch: CLLocationManagerDelegate {
   func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     print("2")
     let userLocation: CLLocation = locations[0] as CLLocation
     self.coordinates = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
     self.completionHandler?(self.coordinates!)
    }
}
...