Можете ли вы отслеживать местоположение пользователей в общем глобальном классе? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть глобальный общий класс, который я использую, чтобы сделать определенные данные доступными из любого места в моем приложении. Одна вещь, которую я пытался достичь, это отслеживать местоположение пользователей и сохранять эти координаты в этом глобальном общем классе.

Я попытался реализовать все необходимые компоненты, которые у меня были в его старом классе, но при этом я вынужден добавить некоторые заглушки протокола, с которыми я не уверен, что делать.

Дополнительно я получаю сообщение об ошибке func self () -> Self {

Это код:

  extension GlobalSharedData: CLLocationManagerDelegate {
   func isEqual(_ object: Any?) -> Bool {
       <#code#>
   }

   var hash: Int {
       <#code#>
   }

   var superclass: AnyClass? {
       <#code#>
   }

   func `self`() -> Self {
       <#code#>
   }

   func perform(_ aSelector: Selector!) -> Unmanaged<AnyObject>! {
       <#code#>
   }

   func perform(_ aSelector: Selector!, with object: Any!) -> Unmanaged<AnyObject>! {
       <#code#>
   }

   func perform(_ aSelector: Selector!, with object1: Any!, with object2: Any!) -> Unmanaged<AnyObject>! {
       <#code#>
   }

   func isProxy() -> Bool {
       <#code#>
   }

   func isKind(of aClass: AnyClass) -> Bool {
       <#code#>
   }

   func isMember(of aClass: AnyClass) -> Bool {
       <#code#>
   }

   func conforms(to aProtocol: Protocol) -> Bool {
       <#code#>
   }

   func responds(to aSelector: Selector!) -> Bool {
       <#code#>
   }

   var description: String {
       <#code#>
   }

Можно ли это сделать? Если да, то как?

1 Ответ

2 голосов
/ 14 мая 2019

Кажется, вы пропустили подклассы NSObject

import Foundation

import CoreLocation

protocol LocationServiceDelegate {
    func tracingLocation(currentLocation: CLLocation)
    func tracingLocationDidFailWithError(error: NSError)
}

class LocationSingleton: NSObject,CLLocationManagerDelegate {
    var locationManager: CLLocationManager?
    var lastLocation: CLLocation?
    var delegate: LocationServiceDelegate?

    static let shared:LocationSingleton = {
        let instance = LocationSingleton()
        return instance
    }()

    override init() {
        super.init()
        self.locationManager = CLLocationManager()

        guard let locationManagers=self.locationManager else {
            return
        }

        if CLLocationManager.authorizationStatus() == .notDetermined {
            locationManagers.requestAlwaysAuthorization()
            locationManagers.requestWhenInUseAuthorization()
        }
        if #available(iOS 9.0, *) {
            //            locationManagers.allowsBackgroundLocationUpdates = true
        } else {
            // Fallback on earlier versions
        }
        locationManagers.desiredAccuracy = kCLLocationAccuracyBest
        locationManagers.pausesLocationUpdatesAutomatically = false
        locationManagers.distanceFilter = 0.1
        locationManagers.delegate = self

    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else {
            return
        }
        self.lastLocation = location
        updateLocation(currentLocation: location)

    }

    @nonobjc func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        switch status {
        case .notDetermined:
            locationManager?.requestAlwaysAuthorization()
            break
        case .authorizedWhenInUse:
            locationManager?.startUpdatingLocation()
            break
        case .authorizedAlways:
            locationManager?.startUpdatingLocation()
            break
        case .restricted:
            // restricted by e.g. parental controls. User can't enable Location Services
            break
        case .denied:
            // user denied your app access to Location Services, but can grant access from Settings.app
            break
        default:
            break
        }
    }



    // Private function
    private func updateLocation(currentLocation: CLLocation){

        guard let delegate = self.delegate else {
            return
        }

        delegate.tracingLocation(currentLocation: currentLocation)
    }

    private func updateLocationDidFailWithError(error: NSError) {

        guard let delegate = self.delegate else {
            return
        }

        delegate.tracingLocationDidFailWithError(error: error)
    }

    func startUpdatingLocation() {
        print("Starting Location Updates")
        self.locationManager?.startUpdatingLocation()
        //        self.locationManager?.startMonitoringSignificantLocationChanges()
    }

    func stopUpdatingLocation() {
        print("Stop Location Updates")
        self.locationManager?.stopUpdatingLocation()
    }

    func startMonitoringSignificantLocationChanges() {
        self.locationManager?.startMonitoringSignificantLocationChanges()
    }

    // #MARK:   get the alarm time from date and time
}

Для использования

LocationSingleton.shared.delegate = self //optional inside the vc
LocationSingleton.shared.startUpdatingLocation() // start this as earlier as possible so when you check of lastLocation is could have a value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...