【问题标题】:How to clear MKMapView cache?如何清除 MKMapView 缓存?
【发布时间】:2011-11-04 06:45:51
【问题描述】:

我正在尝试加载地图区域,并且在第二次或后续加载时未调用 MKMapView 委托方法。没有任何委托方法,即

- (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 协议参考文档中找到了这些行。突出显示的行是我的问题。

当与当前请求关联的地图图块已加载时调用此方法。 当新的可见区域滚动到视图中并且图块尚不可用时,请求地图图块。也可以为当前不可见的地图部分请求地图瓦片。例如,地图视图可能会根据需要立即加载当前可见区域周围的图块,以处理用户的小平底锅。

我需要在地图加载后执行某些操作,但由于没有调用上述委托方法,我无法执行所需的功能。任何人都可以提出解决方案以清除缓存或为此提供替代解决方案吗?我已经尝试过使用herethis 描述的方法,但我仍然无法让代码正常工作。

【问题讨论】:

  • 您究竟想使用这些委托方法实现什么目标?
  • 我需要在 didFinishLoadingMap 中抓取地图,并且这个委托方法只被调用一次,在缓存切片后它既不调用 didfinish 也不调用 failLoad 委托。我现在该怎么办?
  • 我已经提交了与此相关的 Apple Bug #13774496,并创建了一个示例应用程序来显示 iOS6 上仍然存在该问题:github.com/iwasrobbed/MapKitDelegateBug

标签: objective-c ios4 mkmapview


【解决方案1】:

我认为你可以将willStartLoadingMapdidFinishLoadingMapregionDidChange 配对,如下所示:

  • willStartLoadingMap 中将loading 标志设置为true;
  • didFinishLoadingMap 中将加载flag 设置为false,并检查您是否有对捕获屏幕的方法的排队调用。如果是这样,请调用它;
  • regionDidChange 中检查loading 标志,如果它设置为false,则调用捕获屏幕的方法。否则,将其排队,以便在地图加载完成时执行。

这样您可以确保在加载磁贴后捕获屏幕。

但是,regionDidChange 可能会被多次调用,因此请确保仅在地图视图发生显着变化时才抓取屏幕(您可以为此比较​​以前的地图区域/中心和当前的地图区域/中心)。

【讨论】:

  • 谢谢亚历克斯。我添加了一个小补丁以及您建议的步骤,它成功了。
  • 这不适用于您失去互联网连接的情况,因此无法加载更多图块。它仍然调用代表说地图已完全加载。似乎是苹果的一个错误。
【解决方案2】:

我创建了一个新项目并将委托连接到我的视图控制器。所讨论的三个方法中的前两个方法被调用。由于它加载了所有图块,因此未调用错误委托方法。

我最近遇到了类似的问题。我继承了 MKMapView 并忘记在我的自定义 init 方法和 awakeFromNib: 中设置委托。也许这也是导致您的问题的原因。

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 2011-05-21
    • 2012-11-12
    • 2011-05-10
    • 2017-02-11
    • 2020-03-13
    • 2013-02-09
    • 2011-10-17
    • 2011-02-01
    相关资源
    最近更新 更多