Чтобы убрать постоянное обновление вьюхи при использовании LocationManager в SwiftUI, можно воспользоваться следующими шагами:
1. Создайте отдельный класс для обработки геолокации, который будет реализовывать протокол CLLocationManagerDelegate. В этом классе вы можете настроить и управлять LocationManager.
import CoreLocation class LocationManager: NSObject, CLLocationManagerDelegate { let manager = CLLocationManager() override init() { super.init() manager.delegate = self } func startLocationUpdates() { manager.requestWhenInUseAuthorization() manager.startUpdatingLocation() } // Добавьте необходимые методы протокола CLLocationManagerDelegate // например, locationManager(_:didUpdateLocations:) }
2. Создайте ObservableObject для отслеживания изменений местоположения.
import SwiftUI import CoreLocation class LocationViewModel: ObservableObject { @Published var location: CLLocation? private let locationManager = LocationManager() init() { // Здесь можно настроить необходимые настройки геолокации } func startUpdatingLocation() { locationManager.startLocationUpdates() } // Добавьте необходимые методы для обработки изменений местоположения // например, locationManager(_:didUpdateLocations:) }
3. В вашей SwiftUI-вьюхе создайте экземпляр LocationViewModel и подпишитесь на изменения местоположения.
import SwiftUI import CoreLocation struct ContentView: View { @StateObject var viewModel = LocationViewModel() var body: some View { VStack { // Выводим значения, связанные с местоположением Text("Latitude: (viewModel.location?.coordinate.latitude ?? 0)") Text("Longitude: (viewModel.location?.coordinate.longitude ?? 0)") } .onAppear { viewModel.startUpdatingLocation() } } }
В результате, вьюха будет обновляться только при изменении значения местоположения, которое генерирует LocationManager. Это позволяет избежать постоянного обновления вьюхи.