该项目获取当前位置的坐标,此后,它将使用地理编码api google请求当前地址。
它使用两个类:LocationManager获取当前位置(纬度和经度)和ApiGeoManager从当前位置请求地址。和两个视图以显示位置和地址。
LocationManager:
class LocationManager: NSObject, ObservableObject {
override init() {
super.init()
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.startUpdatingLocation()
}
........
........
}
ApiGeoManager:
class APIGeoManager: ObservableObject {
let objectWillChange = PassthroughSubject<Void, Never>()
var resgeo : Postgeo? {
willSet {
objectWillChange.send()
}
}
init(lat: Double, lng: Double) {
........
........
}
两个视图:CoordinateView显示坐标,并能够使按钮转到显示地址的AddressView。
struct CoordinateView: View {
@ObservedObject var locationManager = LocationManager()
var doubleLat : Double {
return locationManager.lastLocation?.coordinate.latitude ?? 0
}
var doubleLng : Double {
return locationManager.lastLocation?.coordinate.longitude ?? 0
}
......
......
var body: some View {
VStack {
HStack() {
.......
if getcoordinates {
HStack(alignment: .center){
Button("Address") {
self.gotopage = true
}
}.padding()
VStack {
if self.gotopage {
AddressView(latitude: self.doubleLat, longitude: self.doubleLng)
}
}
}
}
.padding()
}
}
AddressView:
struct AddressView: View {
var latitude: Double
var longitude: Double
@ObservedObject var apiManager: APIGeoManager
init(latitude: Double, longitude: Double) {
self.latitude = latitude
self.longitude = longitude
self.apiManager = APIGeoManager(lat: latitude, lng: longitude)
}
var body: some View {
VStack {
.........
.........
}
.padding()
}
}
它起作用了,我有了坐标,点击按钮后我就有了地址。 问题在于它不断更新坐标,经常请求对视图具有闪烁效果的地址。
我应该确保一旦获得坐标,便会停止并且不会继续更新位置。
如何修改代码以实现此目的。
谢谢。