Как очистить кеш MKMapView? - PullRequest
12 голосов
/ 26 августа 2011

Я пытаюсь загрузить регион карты, и методы делегата MKMapView не вызываются при второй или последующей загрузке.Ни один из методов делегата viz

- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView;
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView;
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error;

никогда не вызывается.Единственными вызываемыми методами являются

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;

Кажется, что ios4 кэширует изображения тайлов карты.

Я нашел эти строки в справочной документации по протоколу MKMapViewDelegate.Выделенная линия - моя проблема.

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

Мне нужно выполнить определенные операции после загрузки карты, но так как ни один из вышеупомянутых делегатовметоды вызывают, я не могу выполнить желаемую функциональность.Кто-нибудь может предложить исправление, чтобы либо очистить кеш, либо предложить альтернативное решение для этого?Я уже пытался использовать методы, описанные здесь и this , но я до сих пор не смог заставить работать код.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Я думаю, вы можете соединить willStartLoadingMap, didFinishLoadingMap и regionDidChange, вот так:

  • в willStartLoadingMap установить флаг loading в значение true;
  • in didFinishLoadingMap установите для загрузки flag значение false, а также проверьте, есть ли вызов в очереди для метода, который захватывает экран. Если так, назовите это;
  • в regionDidChange проверьте флаг loading и, если он установлен в false, вызовите метод, который захватывает экран. В противном случае поставьте его в очередь, чтобы он выполнялся после завершения загрузки карты.

Таким образом, вы уверены, что захватываете экран после загрузки плиток.

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

2 голосов
/ 08 сентября 2011

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

Я только недавно столкнулся с подобными проблемами.Я подкласс MKMapView и забыть установить делегат в моих пользовательских init методов и в awakeFromNib:.Возможно, это и вызывает твои проблемы.

...