Swiftui的API当前位置和地址

时间:2019-11-27 18:34:12

标签: ios geolocation swiftui xcode11.2

该项目获取当前位置的坐标,此后,它将使用地理编码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()
    }


}  

它起作用了,我有了坐标,点击按钮后我就有了地址。 问题在于它不断更新坐标,经常请求对视图具有闪烁效果的地址。

我应该确保一旦获得坐标,便会停止并且不会继续更新位置。

如何修改代码以实现此目的。

谢谢。

0 个答案:

没有答案