Как сохранить текущее местоположение пользователя по умолчанию?

Я пытаюсь дать пользователям возможность сохранить свое текущее местоположение. Я использую значения по умолчанию, чтобы сохранить его, и я узнал, как получить местоположение пользователей. Но я не знаю, как совместить эти две задачи. Вот мой вопрос:

Как я могу заставить свою функцию вызывать местоположение пользователей, чтобы ее можно было сохранить?

@IBAction func addLocation(_ sender: Any) {

// CALL LOCATION MANAGER TO GET LOCATION IN LAT AND LONG    
    self.saveDefaults()

    }

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
    print("locations = \(locValue.latitude) \(locValue.longitude)")
}

func saveDefaults()
{
    UserDefaults.standard.set(self.pickers, forKey: "pickers")
    print("SAVED PICKERS: \(pickers)")

}

Это моя последняя попытка, но я не знаю, почему моя структура (lat:, long:) не принимает ввод

@IBAction func addLocation(_ sender: Any) {

    var locations: [CLLocation]
    let manager: CLLocationManager

    let userLocation:CLLocation = locations[0] as CLLocation

    // Call stopUpdatingLocation() to stop listening for location updates,
    // other wise this function will be called every time when user location changes.

    manager.stopUpdatingLocation()

    print("user latitude = \(userLocation.coordinate.latitude)")
    print("user longitude = \(userLocation.coordinate.longitude)")

    self.pickers.append(pickerStruct(lat: userLocation.coordinate.latitude, long: userLocation.coordinate.longitude))

    self.saveDefaults()

    }

person Roman H    schedule 12.02.2019    source источник


Ответы (1)


@IBAction func addLocation(_ sender: Any) {
    locationManager.startUpdatingLocation() //This will call the delegate method below where you can save the location
}

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

    guard locations.count > 0 else {
        return
    }

    guard let location = locations.last else {
        return
    }

    locationManager.stopUpdatingLocation() //Stop location updates after getting the location and save that location as below

    let encodedLocation = NSKeyedArchiver.archivedData(withRootObject: location)
    UserDefaults.standard.set(encodedLocation, forKey: "savedLocation")

}

Чтобы вернуть местоположение из UserDefaults:

let previousLocationEncoded = UserDefaults.standard.object(forKey: "savedLocation") as? Data
let previousLocationDecoded = NSKeyedUnarchiver.unarchiveObject(with: previousLocationEncoded!) as! CLLocation
person Sujal    schedule 12.02.2019
comment
Я не уверен, правильно ли вы меня поняли. Я хочу сохранить местоположение, когда пользователь этого захочет (когда он начнет действие, нажав на кнопку). Когда я вас правильно понимаю, он будет сохранять его каждый раз, когда меняется местоположение, верно? - person Roman H; 12.02.2019
comment
@Roman H Я обновил ответ в соответствии с вашим требованием :) - person Sujal; 12.02.2019