Как я могу ждать, пока не будет выполнен обратный вызов LocationService? - PullRequest
2 голосов
/ 16 октября 2019

Я пытаюсь выполнить Службу определения местоположения один раз. Этот LocationService вызывается из другого класса объектов, который добавит информацию о местоположении в параметры. Все это будет один объект.

Проблема в том, что когда я инициализирую объект, все заполняется за исключением данных о местоположении, которые будут заполнены через несколько мс.

Мне нужнодождитесь выполнения обратного вызова, чтобы успешно сгенерировать полный объект, прежде чем использовать его

Итак, учитывая, что у меня есть следующий класс " LocationService "

public class LocationService: NSObject, CLLocationManagerDelegate{
    let manager = CLLocationManager()
    var locationCallback: ((CLLocation?) -> Void)!
    var locationServicesEnabled = false
    var didFailWithError: Error?

    public func run(callback: @escaping (CLLocation?) -> Void) {
        locationCallback = callback
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        manager.requestWhenInUseAuthorization()
        locationServicesEnabled = CLLocationManager.locationServicesEnabled()
        if locationServicesEnabled {
            manager.startUpdatingLocation()
        }else {
            locationCallback(nil)
        }
    }

   public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        locationCallback(locations.last!)
        manager.stopUpdatingLocation()
    }

    public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        didFailWithError = error
        locationCallback(nil)
        manager.stopUpdatingLocation()
    }

    deinit {
        manager.stopUpdatingLocation()
    }
}

И это вызывается из класса объекта следующим образом:

class ObjectX: NSObject{
    //Class variables
    @objc override init() {

    let getLocation = LocationService()
    getLocation.run {
        if let location = $0 {
            //get location parameters
    }}

Наконец, класс ObjectX инициируется и используется из другого места

let getLocation = ObjectX()
//After initiate it I use the object for other purposes, but here the object is not complete, the location parameters have not been populated yet

Как я могуждать в классе, который его вызывает, пока не будет выполнен обратный вызов? Должен ли я использовать getLocation.performSelector ()? Как?

1 Ответ

0 голосов
/ 17 октября 2019

Возможно, это не лучший способ решить эту проблему, но у меня это сработало.

По сути, вместо создания ObjectX и установки в процессе, служба определения местоположения будет вызываться ранее, затемв обратном вызове ObjectX будет инициализирован, тогда мы можем установить параметры местоположения для ObjectX с помощью объекта местоположения, который мы получили в объекте.

Мы удаляем набор местоположения из инициализатора

class ObjectX: NSObject{
    //Class variables
    @objc override init() {
      //Setting the rest of the parameters that are not location
}}

Затем класс, который инициализировал объект, мы инициализируем и запускаем LocationService, затем в обратном вызове создаем ObjectX и задаем параметры местоположения

 let ls = LocationService()
 ls.run { location in
     let objectX = ObjectX()
     objectX.location = location
   //We can use the object here
 }
...