Как передать координаты из didUpdateLocation в некоторый контроллер представления? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь создать LocationService класс, который будет передавать userCoordinate, поэтому он будет многократно использоваться для более чем одного View Controller

import UIKit
import CoreLocation

class LocationService: NSObject {
    let manager = CLLocationManager()

    override init() {
        super.init()

        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.startUpdatingLocation()
    }

    func getPermission() {
        // to ask permission to the user by showing an alert (the alert message is available on info.plist)
        if CLLocationManager.authorizationStatus() == .notDetermined {
            manager.requestWhenInUseAuthorization()
        }
    }

    func checkLocationAuthorizationStatus() -> CLAuthorizationStatus{
        return CLLocationManager.authorizationStatus()
    }
}

extension LocationService : CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == .authorizedWhenInUse {
            manager.requestLocation()
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("location is not available: \(error.localizedDescription)")
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        guard let userLocation = locations.first else {return}

        if userLocation.horizontalAccuracy > 0 {
            manager.stopUpdatingLocation()

            let coordinate = Coordinate(location: userLocation)
            // how to convey this coordinate for several view controller?
        } 
    }
}

, как вы можете видеть в методе didUpdateLocations, который приходит изCLLocationManagerDelegate, для создания координаты требуется некоторое время.

, но я не знаю, как передать эту пользовательскую координату, я думаю, что она будет использовать обработчик завершения, но я не знаю, как это получить

так скажем в HomeVC, я назову это LocationService, чтобы получить userCoordinate

import UIKit

class HomeVC: UIViewController {

    let locationService = LocationService()

    override func viewDidLoad() {
        super.viewDidLoad()

        // get coordinate, something like this
       locationService.getCoordinate()
    }
}

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете использовать Notification, как сказал Paulw11.Вам необходимо обновить didUpdateLocations.Это место, где вы собираетесь публиковать уведомления.

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    guard let userLocation = locations.first else {return}

    if userLocation.horizontalAccuracy > 0 {
        manager.stopUpdatingLocation()

        let coordinate = Coordinate(location: userLocation)
        let locationDictionary: [String: Double] = ["lat": location.coordinate.latitude,
                                      "long": location.coordinate.longitude]
         NotificationCenter.default.post(name: NSNotification.Name(rawValue: "YourNotificationNameAsYouWantToNameIt"), object: nil, userInfo: locationDictionary)
    } 
}

Теперь в viewDidLoad в каждом контроллере представления, для которого вы хотите это местоположение, вам необходимо соблюдать это уведомление:

NotificationCenter.default.addObserver(self, selector: #selector(doSomethingAboutLocation(_:)), name: NSNotification.Name(rawValue: "YourNotificationNameAsYouWantToNameIt"), object: nil)

Затем получите доступ к своему местоположению, как это в вашей функции, вызываемой из селектора:

@objc func doSomethingAboutLocation(_ notification: Notification) {
    if let notificationInfo = notification.userInfo {
       let coordinate = CLLocation(latitude: notificationInfo["lat"] as! Double, longitude: notificationInfo["long"] as! Double)
       // use your coordinate as you want
    }
}
...