Как использовать locationManager () в нескольких ViewControllers - PullRequest
0 голосов
/ 16 декабря 2018

Мне нужно получить zipCode и city в нескольких viewControllers.

Вот как я сейчас это делаю ...

import CoreLocation
let locationManager = CLLocationManager()

class MyViewController: UIViewController, CLLocationManagerDelegate{
    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
    }
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)-> Void in
            if error != nil {
                //AlertView to show the ERROR message
            }

            if placemarks!.count > 0 {
                let placemark = placemarks![0]
                self.locationManager.stopUpdatingLocation()
                let zipCode = placemark.postalCode ?? ""
                let city:String = placemark.locality ?? ""

                // Do something with zipCode
                // Do something with city
            }else{
                print("No placemarks found.")
            }
        })
    }

 func someFunction() {
    locationManager.startUpdatingLocation()
 }

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

Какой самый распространенный способ получить zipCode и city из CLLocationManager() более практичным способом из нескольких viewControllers?

Я думаю, что-то вроде ...

 MyLocationManager.zipCode() // returns zipCode as a string 
 MyLocationManager.city() // returns city as a string 

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

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

0 голосов
/ 16 декабря 2018

Я пытался реализовать одноэлементный класс CLLocationManager, я думаю, вы можете изменить следующий класс для реализации некоторых дополнительных методов.

import Foundation

class LocationSingleton: NSObject, CLLocationManagerDelegate {
private let locationManager = CLLocationManager()
private var latitude = 0.0
private var longitude = 0.0

static let shared = LocationSingleton()

private override init() {
    super.init()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.distanceFilter = kCLLocationAccuracyHundredMeters
    locationManager.requestAlwaysAuthorization() // you might replace this with whenInuse
    locationManager.startUpdatingLocation()
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.last {
        latitude = location.coordinate.latitude
        longitude = location.coordinate.longitude
    }
}

private func getLatitude() -> CLLocationDegrees {
    return latitude
}

private func getLongitude() -> CLLocationDegrees {
    return longitude
}

private func zipCode() {
    // I think you can figure way out to implemet this method
}

private func city() {
    // I think you can figure way out to implemet this method
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...