GeoFenceController с CLLocationManager как синглтон?

У меня есть класс GeoFence. Я обсуждаю сам, должен ли он быть синглтоном. Мой код работает в любом случае, и я прочитал пару статей и сообщений здесь, на SO об этом. Но я не нашел хороших правил, когда правильно использовать синглтон.

Я действительно не могу придумать причину, по которой этого не должно быть, и у меня есть несколько причин, по которым это должно быть; классическое "будет только один!" а также то, что класс на самом деле не имеет никаких зависимостей, насколько я могу судить, кроме объекта locationManager, который он мог бы также создать сам, поскольку он не нужен где-либо еще, и я не верю, что какие-либо специальные реализации могли бы когда-нибудь потребуются. По этой причине я не вижу смысла вводить locationManager. Также необходимо использовать другой общий экземпляр в приложении, которое вызывает сервер для получения некоторых данных. Я думаю, что наиболее важной причиной сделать его синглтоном будет то, что он отслеживает отслеживаемые регионы и хранит некоторые данные, связанные с этим, а также некоторые временные метки и другие второстепенные вещи в NSUserDefaults. Опасаюсь, что другой экземпляр класса может вызвать непоследовательное поведение приложения.

Мой код предназначен для добавления в существующее приложение в качестве расширения.

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

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


person VeryPoliteNerd    schedule 13.05.2015    source источник


Ответы (1)


GeoFenceController будет использовать глобальный ресурс — пул из 20 регионов, доступных вашему приложению. Этот пул реализован таким образом, что не только емкость распределяется между всеми экземплярами CLLocationManager, но и все регионы также будут эффективно совместно использоваться, поскольку все экземпляры CLLocationManager будут сообщать о событиях входа/выхода своим делегатам для всех регионов. . Отслеживание ограничений емкости и «собственных» событий приведет к запутанному коду.

Вот почему одноэлементный шаблон здесь вполне приемлем.

person Alex Pavlov    schedule 13.05.2015
comment
Мой руководитель проекта согласен с вами, поэтому я приму этот ответ. Это имеет смысл для меня. Просто все твердые мнения о синглтонах могут заставить меня усомниться в себе. - person VeryPoliteNerd; 13.05.2015
comment
@VeryPoliteNerd Спасибо, и имейте в виду, что все эти сильные мнения о синглтонах имеют большой смысл. В большинстве случаев синглтоны — это просто попытка обернуть глобальные переменные чем-то, что выглядит более профессионально. Я бы все равно реализовал GeoFenceController как обычный класс со статическим методом +sharedInstance. Это упростит модульное тестирование и рефакторинг, если вам придется обрабатывать вариант использования, требующий нескольких экземпляров GeoFenceController в будущем. - person Alex Pavlov; 13.05.2015
comment
@VeryPoliteNerd, не могли бы вы дать мне свой код ?? - person SaiPavanParanam; 08.11.2016