Должен ли я использовать диспетчер местоположения синглтона в Swift? - PullRequest
1 голос
/ 12 июня 2019

Контекст:

Мое приложение нуждается в текущем местоположении пользователя в нескольких несвязанных контроллерах представления, и на данный момент я создаю CLLocationManager в каждом из этих контроллеров и запрашиваю текущее местоположение снова и снова.

Однако, мне это не кажется правильным. Это дублирующийся код и неэффективный . Я видел несколько ссылок в Интернете, в которых упоминается менеджер местоположения синглтона. И я также слышал, чтобы как можно больше избегать синглетонов.

Вопрос:

Должен ли я создать одноэлементный класс, который управляет местоположением? Если нет, какое другое решение вы бы предложили, чтобы избежать дублирования кода?

Ответы [ 4 ]

2 голосов
/ 12 июня 2019

И я также слышал, чтобы как можно больше избегать одиночек

Вышеприведенное утверждение верно в том случае, если какой-либо цикл запуска приложения требует этих данных, поэтому после его завершения синглтон становится проблемой с точки зрения памяти, поскольку в вашем случае он остается живым весь жизненный цикл приложения (все vcs внутри приложению требуется местоположение) лучше всего подходит для одиночного файла, чтобы избежать дублирования - менее эффективный код и проблемы с памятью

Излишне говорить, что 90% классов Apple используют синглеты e.x

URLSession.shared

NSNotificationCenter.default

UNUserNotificationCenter.current

UserDefaults.standard

FileManager.default

1 голос
/ 13 июня 2019

Если вы создаете одноэлементный менеджер местоположений, он должен действовать иначе, чем другие синглтоны.Вы не можете использовать нормальный шаблон делегата для него, чтобы сообщить другим объектам об обновлениях местоположения и ошибках, потому что нормальный шаблон делегата является отношением один к одному.Вы должны использовать несколько делегатов (синглтон имеет массив заинтересованных объектов, и он отправляет одно и то же сообщение, например, обновление местоположения, каждому).Вот еще один вопрос о том, почему это трудно использовать:

Несколько делегатов в iOS

Вы можете обойти это с помощью уведомлений, но лично я считаю, что это плохой шаблон (он расцепляетслишком много вещей и мешает идти по пути ответственности).

Синглтон также должен отслеживать, просил ли какой-либо из его заинтересованных объектов остановить или запустить.Если они все попросили его остановить, то это должно отключить обновления.Если кто-то хочет обновлений, он должен включить их обратно.Ищите всех людей, создающих фреймворки, просто чтобы выполнить ту же задачу с индикатором сети, чтобы увидеть, сколько это проблем.

Если при запросе местоположения возникает ошибка, вы должны сохранить эту ошибку и когда (через некоторое время) объект хочет местоположение, вы должны повторно передать ошибку.Так что на самом деле вы хотите, чтобы все заинтересованные объекты были подключены и прослушивались с самого начала, чтобы избежать этого сценария.

Я уверен, что мог бы придумать более сложные случаи, с которыми вам пришлось бы иметь дело.

Промежуточный вариант заключается в создании класса диспетчера местоположений с вашей специальной настройкой, проверкой ошибок и т. Д., А также в случае необходимости создавать один из них.Используйте шаблон делегата для получения сообщений от него (большинство из них будут просто передавать сообщения напрямую).

1 голос
/ 13 июня 2019

Шаблоны не являются злом.Это зависит от пользователя.Это решения для конкретных проблем.Это зависит от того, как вы видите свою проблему и чего хотите достичь.

В вашем случае вам нужен экземпляр менеджера местоположений в вашем приложении, и вы используете его в нескольких местах, поэтому вам нужен менеджер-обертка.Если вам нужна только одна конфигурация, то имеет смысл использовать синглтон.

Apple рекомендует иметь сильную рекомендацию менеджера, пока вам это нужно. CLLocationManager - Документация Apple

Создайте экземпляр класса CLLocationManager и сохраните сильную ссылку на него где-нибудь в вашем приложении.Сохранение строгой ссылки на объект диспетчера местоположения необходимо до тех пор, пока не будут выполнены все задачи, связанные с этим объектом.Поскольку большинство задач диспетчера местоположений выполняются асинхронно, недостаточно хранить диспетчер местоположений в локальной переменной.

1 голос
/ 13 июня 2019

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

Это стандартная стратегия, позволяющая выбрать экземпляр, который сохраняется в течение всей жизни вашего приложения - например, вашего делегата приложения или вашего корневого контроллера представления, - и инициализировать свойство экземпляра с помощью диспетчера местоположений. Нет никаких оснований добавлять паттерн Синглтон в микс; Вы просто делаете один раз и держите его.

...