Определите свойство для захвата вашего обработчика завершения:
private var handler: (([CLLocation]) -> Void)?
И getDPS
сохраните его и начните обновлять локации:
func getDPS(_ completion: @escaping ([CLLocation]) -> Void) {
handler = completion
locationManager.startUpdatingLocation()
}
И тогда ваш didUpdateLocations
может вызвать это закрытие:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
handler?(locations)
handler = nil
locationManager.stopUpdatingLocation()
}
Собрав все это воедино, может быть что-то вроде:
class LocationTrack: NSObject {
private lazy var locationManager: CLLocationManager = {
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization() // perhaps `requestWhenInUseAuthorization` is better?
return locationManager
}()
private var handler: (([CLLocation]) -> Void)?
func getDPS(_ completion: @escaping ([CLLocation]) -> Void) {
handler = completion
locationManager.startUpdatingLocation()
}
}
extension LocationTrack: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
handler?(locations)
handler = nil
locationManager.stopUpdatingLocation()
}
}
Ясно, что вы можете добавить свою собственную обработку ошибок и то, что у вас есть, но, надеюсь, это иллюстрирует идею сохранения замыкания в свойстве и вызова его при получении обратного вызова вашего делегата.