iOS. Приемы программирования
Шрифт:
Если
Методы NSLog из приведенного ранее кода выводят в окне консоли адрес, прошедший процедуру обратного геокодирования:
Обсуждение
В каждом приложении имеется лимит объема запросов на обратное геокодирование, которые могут быть выполнены в данном приложении за один день. Этот объем определяется провайдером серверного приложения, обеспечивающего поддержку геолокационных служб в iOS. Существуют различные платные онлайновые сервисы, которые предоставляют разработчикам сторонние API. Я не могу сейчас рекламировать какие-либо из подобных сервисов, но можете сами поискать их в Интернете, если захотите преодолеть ограничения, связанные с обратным геокодированием пространственных координат, существующие в настоящее время в iOS SDK. Чтобы выполнить запрос на обратное геокодирование, нужно создать экземпляр класса CLGeocoder. Этот класс требует активного сетевого соединения — оно необходимо для успешной обработки запросов. Значения, прошедшие обратное геокодирование, сообщаются блоку обработки завершения, который передается методу reverseGeocodeLocation: completionHandler:.
См. также
Раздел 9.7.
9.9. Поиск в картографическом виде
Постановка задачи
Требуется предоставить пользователям, просматривающим картографический вид, поисковую функцию. Например, можно помочь им найти все рестораны или тренажерные залы в конкретном регионе, отображенном на карте. Если пользователь находится в центре города и видит свое местоположение на карте, он может просто ввести в строку поиска слово «рестораны» — и приложение выполнит поиск по такому запросу.
Решение
Картографические виды, без преувеличения, просто великолепны. Но иногда такой вид ничем не может помочь пользователю, который видит на экране просто одну большую карту. В таком случае вполне сгодится и обычная бумажная карта. Картографические возможности смартфонов интересны именно в контексте их интерактивности. Пользователь может находить на карте объекты, искать интересующие его места, получать информацию о том, как попасть в место, расположенное по тому или иному адресу. Apple включила в iOS SDK три очень удобных класса, позволяющих пользователю искать места на карте. Такой поиск совершенно прост. От вас требуется всего лишь ввести текстовый запрос о том, что вас интересует, например «рестораны» или «кафе, — и SDK выполнит за вас остальную работу. В этом разделе мы собираемся отобразить в контроллере вида картографический вид (с местоположением
Как только картографический вид поможет нам установить местоположение пользователя (предполагается, что пользователь разрешил нам это сделать), мы вызовем класс MKLocalSearch и выберем все рестораны, находящиеся поблизости от него. Первым делом определим картографический вид, вот так:
Мы используем свойство showsUserLocation картографического вида. Это логическое значение. Если оно равно YES, то картографический вид ищет местоположение пользователя (при наличии у нас разрешения на это). Все это, конечно, хорошо, но по умолчанию картографический вид действует так: он находит место на карте и отображает для него аннотацию, но не перемещает центральную точку карты и не увеличивает то место, где располагается пользователь. Иными словами, если в данный момент в картографическом виде отображается карта Великобритании, а пользователь находится где-то в Нью-Йорке, то он по-прежнему будет видеть на экране своего устройства карту Соединенного королевства. Чтобы исправить этот недостаток, нужно задать для свойства userTrackingMode картографического вида значение MKUserTrackingModeFollow, при котором центр картографического вида всегда соответствует местоположению пользователя. Отображаемая часть карты корректируется в соответствии с перемещением пользователя.
Теперь, когда мы приказали картографическому виду отслеживать местоположение пользователя, необходимо реализовать следующие методы делегатов картографического вида:
• mapView: didFailToLocateUserWithError: — вызывается в делегате, когда картографическому виду не удается определить местоположение пользователя. В этом методе мы выводим для пользователя предупреждение о том, что определить его местоположение не получается;
• mapView: didUpdateUserLocation: — вызывается в делегате картографического вида всякий раз, когда информация о местоположении пользователя обновляется. Таким образом, он всегда соответствует успешному варианту развития бизнес-логики. В этом методе можем реализовать локальную функцию поиска.