Важное примечание: Я знаю, что я мог бы просто вызвать мою callback
функцию внутри didUpdateLocations
и добиться того, чего я хочу. К сожалению, этот маршрут не может быть выбран из-за некоторых уже существующих проектных решений, которые были приняты в этом проекте (на которые я не имею никакого влияния).
Мне нужно написать функцию, которая запускает первый раз, когда пользователь обновляет координаты, а затем передает эти координаты обработчику завершения. В моем случае этот обработчик завершения является функцией с именем fetchCountry(fromLocation: CLLocation)
, которая возвращает страну, соответствующую заданному CLLocation
.
Другими словами, я хочу написать функцию, аналогичную didUpdateLocations
, с возможностью вызова обработчика завершения после получения этих обновлений:
func getUserLocation(callback: @escaping (CLLocation?) -> Void) {
// wait until user's location has been retrieved by location manager, somehow
// prepare output for callback function and pass it as its argument
let latitude = manager.location!.coordinate.latitude
let longitude = manager.location!.coordinate.longitude
let location = CLLocation(latitude: latitude, longitude: longitude)
callback(location)
}
Короче говоря, getUserLocation
- это просто оболочка для didUpdateLocations
, но я действительно не уверен, как бы я написал эту функцию, чтобы она достигла того, чего я хочу.
Моя большая цель здесь - показать пользователю локальное уведомление только в том случае, если они находятся в определенной стране (например, США) после запуска приложения. Моему приложению трудно принять решение о планировании / не планировании этого уведомления внутри AppDelegate.swift , но это решение не может быть принято до тех пор, пока не будет найдено местоположение пользователя. Я планирую использовать getUserLocation
внутри приложения Delegate следующим образом:
Надеюсь, что я ясно дал понять, что хочу добиться этого, используя функцию с обработчиком завершения . Вот что я хотел бы, чтобы мой код (т.е. мой сценарий использования), внутри AppDelegate.swift :
// inside didFinishLaunchingWithOptions
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in
if granted {
// this is the use case of the function I am trying to write
LocationManager.shared.getLocation(completion: { location in
// fetches the country from given location using reverse geo-coding
LocationManager.shared.fetchCountry(from: location, completion: { country in
if country == "United States" {
let notification = LocalNotification()
notificationManager.schedule(notification: notification)
}
})
})
}
}