В моем приложении у меня есть фоновая служба и контроллер представления, которому требуется обновление местоположения (не постоянно). Итак, я подумал, что лучше иметь одноэлементный класс для сбора обновлений местоположения и распространения их в разные части моего приложения, а не делегировать каждому объекту, которому требуется местоположение.
Мой менеджер местоположения - это одноэлементный класс, который устанавливает CLLocationManager, включает местоположение, когда что-то вызывает диспетчер местоположения и запрашивает местоположение. Как это работает, у него есть метод currentLocation, который принимает закрытие в качестве аргумента. LocationManager сохраняет закрытия, переданные этому методу, в массиве. Каждый раз, когда вызывается метод, locationManager включает обновления местоположения, и, когда у него достаточно хорошее местоположение, он выполняет все закрытия, передавая им полученное местоположение и очищая ExecutionQueue.
Я знаю о циклах сохранения и осторожен со списками захвата, приведенными в замыканиях. Однако я получаю редкий thunk for @escaping @callee_guaranteed crash
, пока выполняется закрытие. В последний раз, когда я получил это, логи жаловались на плохое использование weak. Я использую объект со слабой ссылкой (weak self) в закрытии, но остальная часть закрытия выполняется только в том случае, если слабая ссылка действительно содержит ссылку на объект (if let self = self { ... }
)
У меня есть несколько вопросов
Это плохой дизайн? Могу я сделать это лучше?
Я знаю, что NSNotifications также являются эффективным способом отправки данных в разные части приложения. Я хочу знать, лучше это или хуже моего дизайна и как.
Когда я хочу отправлять непрерывные обновления местоположения различным объектам, какой метод является хорошим? Например, добавление наблюдателя с целью и селектором (это objectiveC-ish)
Я имею в виду другой дизайн. В моем locationManager будет метод
addObserver
с аргументом, который является объектом, реализующим протокол для получения обновлений местоположения. Это хороший дизайн?
Publisher
. - person Alexander   schedule 08.07.2020