Использование переменной за пределами locationManager () - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь очистить свой код, используя MVC Pattern. У меня есть один файл «CoreLocationService.swift», где я хочу получить местоположение. Затем я хочу использовать местоположение в ViewController.swift, чтобы показать его пользователю.

CoreLocationService.swift

import Foundation
import CoreLocation

class CoreLocationService: CLLocationManager, CLLocationManagerDelegate {


    let locationManager = CLLocationManager()

    var latitude : Double?


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let GPS = locations[locations.count - 1] // Get the array of last location

        latitude = GPS.coordinate.latitude


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


    func GPSInitialize() {
        // Start GPS

        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        //locationManager.requestLocation() // One time request
        locationManager.startUpdatingLocation() // Continues location

    }


}

ViewController.swift

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

//    let location = CLLocationManager()

    let locationService = CoreLocationService() // CoreLocationService Class


    override func viewDidLoad() {
        super.viewDidLoad()


        locationService.GPSInitialize() // Start updating Location


        print(locationService.latitude) // Print Latitude

    }

}

Я объявил широту как глобальную переменную для доступа из ViewController.swift, но переменная пустая и печатает только «ноль».

Если я печатаю «Печать (широта)» в locationManager, он печатает координаты.

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Я думаю, почему широта равна нулю при вызове print (loccationService.latitude) в том, что метод делегата

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

еще не обновил широту.

Вы можете добавить один обратный вызов в CoreLocationService, как показано ниже,

// callback to be called after updating location
var didUpdatedLocation: (() -> ())?

, а затем вызвать это замыкание в методе делегата,

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let GPS = locations[locations.count - 1] // Get the array of last location

        latitude = GPS.coordinate.latitude

        didUpdatedLocation?()
}

В вашем ViewController выведите следующую широту:

locationService.didUpdatedLocation = {
    print(locationService.latitude) // Print Latitude
}

Надеюсь, это поможет!

0 голосов
/ 19 мая 2019

В вашем коде функция viewDidLoad () вызовет функцию GPSInitialize () в классе CoreLocatinoService. В это время, когда он выполняет следующую строку кода, значение 'широта' будет равно нулю, поскольку метод делегата CLLocationManager 'didUpdateLocation' может быть вызван не сразу, как только вызывается startUpdatingLocation ().

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

Надеюсь, это поможет.

...