CLLocationManager
должно быть создано в цикле выполнения. Если вы этого не сделаете, вы получите следующее предупреждение от CoreLocation
:
Менеджер местоположения был создан в очереди отправки, выполняющейся в потоке, отличном от основного потока. Разработчик несет ответственность за обеспечение того, чтобы в потоке, в котором размещен объект диспетчера местоположений, выполнялся цикл выполнения. В частности, создание администраторов местоположений в произвольных очередях отправки (не прикрепленных к основной очереди) не поддерживается и приведет к тому, что обратные вызовы не будут получены.
В вашем случае похоже, что ваш locationManager
создается в main thread
, но экземпляр WorkoutLocationManager
используется в каком-то другом потоке, что приводит к его освобождению в этом потоке, и, следовательно, , освобождая locationManager
в том же потоке.
Один из вариантов - убедиться, что ваш экземпляр WorkoutLocationManager
будет создан и использован только в главном потоке.
Другой вариант, который я не полностью протестировал, - это попытаться принудительно создать и освободить locationManager
в главном потоке, например:
class WorkoutLocationManager: NSObject {
var locationManager: CLLocationManager!
override init() {
super.init()
self.performSelector(onMainThread: #selector(initLocationManager), with: nil, waitUntilDone: true)
}
@objc private func initLocationManager() {
self.locationManager = CLLocationManager()
self.locationManager.delegate = self
}
@objc private func deinitLocationManager() {
locationManager = nil
}
deinit {
self.performSelector(onMainThread: #selector(deinitLocationManager), with: nil, waitUntilDone: true)
}
}
Дайте мне знать, что вы об этом думаете.