monitoredRegions не доступен для КВО - PullRequest
0 голосов
/ 28 октября 2018

Мое приложение использует мониторинг региона. Он устанавливает несколько регионов и обновляет их динамически.
Это делается путем очистки всех отслеживаемых регионов и установки новых.

Одна проблема, с которой я столкнулся, заключается в том, что очистка отслеживаемых областей выполняется не сразу, а, по-видимому, позже в отдельном потоке, см. здесь .

Поскольку количество отслеживаемых областей ограничено 20, мне нужно подождать, пока свойство monitoredRegions не станет пустым массивом, прежде чем я смогу добавить новые регионы.

Моя идея заключалась в том, чтобы использовать KVO, чтобы получать уведомления при изменении этого свойства. Это делается следующим образом (сокращенная версия):

final class LocationManager: CLLocationManager {

    static let shared = LocationManager() // Instantiate the singleton

    private static var locationManagerKVOcontext = 0

    private override init () {
        super.init()

        addObserver(self, 
                    forKeyPath: #keyPath(monitoredRegions), 
                    options: [],
                    context: &LocationManager.locationManagerKVOcontext)
    }

    override func observeValue(forKeyPath keyPath: String?, 
                               of object: Any?, 
                               change: [NSKeyValueChangeKey : Any]?, 
                               context: UnsafeMutableRawPointer?) {
        guard context == &LocationManager.locationManagerKVOcontext else {
            super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
            return
        }
        guard keyPath == #keyPath(monitoredRegions) else { return }
        if monitoredRegions.isEmpty {
            stopMonitoringRegionsCompletionBlock?()
        }
    }

С этим кодом я получаю следующую ошибку сборки, где использую #keyPath(monitoredRegions):

LocationManager.swift:71:30: 'monitoredRegions' is unavailable  
/CoreLocation.CLLocationManager:50:14: 'monitoredRegions' has been explicitly marked unavailable here

Если я заменим #keyPath(monitoredRegions) на “monitoredRegions“, я могу создать приложение, поскольку компилятор не может проверить правильность keyPath, но monitoredRegions не наблюдается, т. Е. func observeValue не вызывается.

Так что мне кажется, что наблюдение значения ключа monitoredRegions невозможно.

Мои вопросы:

Мой код в принципе правильный или есть обходной путь?

PS: Полагаю, я мог бы самостоятельно опрашивать это свойство, но это выглядит ужасно.

Редактировать:

Я реализовал опрос, чтобы иметь какое-либо решение и получить на порядок, сколько времени требуется для очистки контролируемых областей.
В моем случае для очистки всех отслеживаемых областей требуется от 0,2 до 1,4 секунд. Это время, безусловно, зависит от того, сколько регионов нужно очистить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...