在 locationManager() 之外使用变量
Using Variable outside locationManager()
我正在尝试使用 MVC 模式清理我的代码。我有一个文件 "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 但该变量为空并且仅打印 "nil".
如果我在 locationManager 中打印 "Print(latitude)",它会打印坐标。
我认为为什么当你调用 print(loccationService.latitude) 时纬度为零是委托方法
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [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
}
希望对您有所帮助!
在您的代码中,viewDidLoad() 函数将调用 CoreLocatinoService class 中的 GPSInitialize() 函数。此时执行下一行代码时,'latitude'值为nil,因为CLLocationManager'didUpdateLocation'的delegate方法可能不会在调用startUpdatingLocation()后立即被调用。
作为此问题的解决方案,我建议使用另一个委托或闭包来通知视图控制器位置更新并传递最新的位置详细信息。
希望对您有所帮助。
我正在尝试使用 MVC 模式清理我的代码。我有一个文件 "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 但该变量为空并且仅打印 "nil".
如果我在 locationManager 中打印 "Print(latitude)",它会打印坐标。
我认为为什么当你调用 print(loccationService.latitude) 时纬度为零是委托方法
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [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
}
希望对您有所帮助!
在您的代码中,viewDidLoad() 函数将调用 CoreLocatinoService class 中的 GPSInitialize() 函数。此时执行下一行代码时,'latitude'值为nil,因为CLLocationManager'didUpdateLocation'的delegate方法可能不会在调用startUpdatingLocation()后立即被调用。
作为此问题的解决方案,我建议使用另一个委托或闭包来通知视图控制器位置更新并传递最新的位置详细信息。
希望对您有所帮助。