Home > database >  Message sent to other class via Delegation when the locationManagerDidChangeAuthorization method is
Message sent to other class via Delegation when the locationManagerDidChangeAuthorization method is

Time:01-21

In the following code, I'm trying to call a method located inside the LocationManagerViewModel class when the locationManagerDidChangeAuthorization is called from inside the LocationManager class via delegation, but nothing happens when it gets called, I only see the debug message Calling method locationManagerDidChangeAuthorization but the method locationManagerDelegateComunicationMethod inside the LocationManagerViewModel never gets called.

Any idea what could be wrong?

Location Manger Class; Sender

protocol LocationManagerDelegate {
    func locationManagerDelegateComunicationMethod()
}

final class LocationManager: NSObject, CLLocationManagerDelegate {
    
    private let locationManager = CLLocationManager()
    
    var delegate: LocationManagerDelegate?
        
    var hasFoundOnePlacemark:Bool = false

    func checkIfLocationServicesIsEnabled(){
        DispatchQueue.global().async {
            if CLLocationManager.locationServicesEnabled(){
                self.locationManager.delegate = self
                self.checkLocationAuthorization()
            }else{
                print("You have Location Services DESABLED!")
            }
        }
    }
    
    private func checkLocationAuthorization(){
        switch locationManager.authorizationStatus{
        case .notDetermined:
            print("notDetermined")
        case .restricted:
            print("restricted")
        case .denied:
            print("denied")
        case .authorizedWhenInUse, .authorizedAlways:
            print("authorizedWhenInUse")
        default:
            break
        }
    }
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        print("Calling method locationManagerDidChangeAuthorization")
        var delegate: LocationManagerDelegate? = LocationManagerViewModel()// I tried with and without this line
        delegate?.locationManagerDelegateComunicationMethod()
    }
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        hasFoundOnePlacemark = false
        
        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)-> Void in
            if error != nil {
                self.locationManager.stopUpdatingLocation()
            } 
                        
            if placemarks!.count > 0 {
                if !self.hasFoundOnePlacemark{
                    self.hasFoundOnePlacemark = true
                    self.locationManager.stopUpdatingLocation()
            }else{
                self.noPlacesFoundAlertView()
            }
        })
    }
}

LocationManagerViewModel Class; Receiver

class LocationManagerViewModel: ObservableObject, LocationManagerDelegate{
    // some @Published properties here
    
    private var locationManager = LocationManager()
    
    func locationManagerDelegateComunicationMethod() {
        print("Received message from the LocationManager class!")
        // do something...
    }
}

Thanks

CodePudding user response:

The delegate is never assigned in LocationManagerViewModel. You probably need to assign it in an init:

class LocationManagerViewModel: ObservableObject, LocationManagerDelegate{
    // some @Published properties here
    
    private var locationManager = LocationManager()
    
    init(){
        locationManager.delegate = self
    }

    func locationManagerDelegateComunicationMethod() {
        print("Received message from the LocationManager class!")
        // do something...
    }
}
  • Related