Общий экземпляр CLLocationManager

Я пытался создать простой общий экземпляр CLLocationManager для моего приложения.

Не было проблем при создании общего экземпляра:

import UIKit
import CoreLocation

protocol LocationHandlerDelegate: class {
    func locationHandlerDidUpdateLocation(location: CLLocation?)
    func locationHandlerDidFailWithError(error: NSError)
}

class LocationHandler: NSObject, CLLocationManagerDelegate {

    var locationManager: CLLocationManager!
    var location: CLLocation?
    weak var delegate: LocationHandlerDelegate?

    static let sharedInstance = LocationHandler()

    override init() {
        super.init()

        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyKilometer

        if CLLocationManager.authorizationStatus() == .NotDetermined {
            locationManager.requestWhenInUseAuthorization()
        }
    }

    // MARK: -
    // MARK: - CLLocationManagerDelegate functions
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        delegate?.locationHandlerDidUpdateLocation(locations.last)
        self.location = locations.last

        locationManager.stopUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        delegate?.locationHandlerDidFailWithError(error)

        locationManager.stopUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        if status == .AuthorizedAlways || status == .AuthorizedWhenInUse {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
        }
    }
}

Но по какой-то причине, когда я вызываю свой общий экземпляр из другого класса:

class TodayViewController: UIViewController, CLLocationManagerDelegate, LocationHandlerDelegate {
        super.viewDidLoad() {

        LocationHandler.sharedInstance.delegate = self        

        if #available(iOS 9.0, *) {
            LocationHandler.sharedInstance.locationManager.requestLocation()
        } else {
            LocationHandler.sharedInstance.locationManager.startUpdatingLocation()
        }
}
...
    // MARK: - LocationHandlerDelegate function
    func locationHandlerDidUpdateLocation(location: CLLocation?) {
        if let location = location {
            print("Current lcoation: \(location)")
        }
        else {
            // ...
        }
    }

    func locationHandlerDidFailWithError(error: NSError) {
        print("Error finding lcoation: \(error.localizedDescription)")
    }
}

Ни одна из функций CLLocationManagerDelegate в моем LocationHandler не вызывается. Но если в TodayViewController я напишу

LocationHandler.sharedInstance.locationManager.delegate = self

вместо

LocationHandler.sharedInstance.delegate = self

и я реализую CLLocationManagerDelegate функции в моем TodayViewController вместо LocationHandler тогда эти функции делегата вызываются. Итак, я думаю, что могут быть некоторые проблемы с экземплярами? Или я что-то упускаю?

0 ответов

Другие вопросы по тегам