【问题标题】:iOS MKMapShapshotter completion block is not always being callediOS MKMapSnapshotter 完成块并不总是被调用
【发布时间】:2016-08-09 16:23:26
【问题描述】:

我正在尝试使用新的 iOS7 MKMapSnapshotter 来生成静态地图图像。每当我的应用需要地图时,我都会调用以下命令:

MKMapSnapshotter *snapshotter = [[[MKMapSnapshotter alloc] initWithOptions:theOptions] autorelease];
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
DebugLog(@"Snapshotter allocated %@ and run on queue %@", snapshotter, aQueue);

[snapshotter startWithQueue:aQueue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
    DebugLog(@"Snapshotter completion block %@", snapshotter);
    // perform selector on main thread to set self.imageView.image = shanpshot.image;
}

在大多数情况下,这很有效。但是有时,设备似乎因地图请求而过载,然后停止渲染。在我的日志文件中,我将看到关于“已分配快照器”的第一条日志语句,但从未看到“快照器完成块”消息。

有没有可能我的请求永远不会从调度队列中执行? 有人遇到过这个问题吗?

【问题讨论】:

  • 您找到解决方案了吗?我面临同样的问题:/
  • 你试过使用 - (void)startWithCompletionHandler:(MKMapSnapshotCompletionHandler)completionHandler 吗?
  • 我将首先为您的快照程序实例创建一个专用队列。如果问题得到可靠解决,则您可能已在应用中的其他位置阻止了全局后台队列。

标签: ios ios7 mapkit grand-central-dispatch mkmapsnapshotter


【解决方案1】:

这是(或似乎是)MKMapSnapshotter 中的一个错误。

如果网络数据和 WiFi 被关闭,将不会调用完成处理程序(除非操作系统中有缓存数据 - 请参阅https://stackoverflow.com/a/5769108/481207 清除缓存)。

事实上,快照程序似乎阻止了等待数据。它不会超时或检测到没有数据。几分钟后,例如15 分钟,snapshotter.isLoading = YES。调用 cancel 不会导致调用完成处理程序。

如果 WiFi 或网络数据重新打开,随后启动(新)快照程序的调用将调用完成处理程序。

如果在处理程序中启动和清除快照程序时设置了变量,这会很糟糕,因为该变量永远不会被清除。

if (!isRendering) {
    isRendering = YES;

    [snapshotter startWithCompletionHandler:
     ^(MKMapSnapshot* snapshot, NSError* error) {
         // This may not be called so this code will
         // never run again.
         isRendering = NO;
     }];
}

【讨论】:

    【解决方案2】:

    这个问题可能是由于快照器不是一个属性而出现的,因此它在离开这个范围后很快就会自动释放。将快照程序保留为属性应该可以修复它。

    【讨论】:

      【解决方案3】:

      在不同的 iOS 版本中遇到相同的问题。关键是 AppleMaps 应用程序也没有正确加载地图。重新启动设备使其正常工作。所以我想这是一个苹果的错误。

      【讨论】:

        【解决方案4】:

        我也有同样的问题。原因是在 MKMapSnapshotOptions 中我设置了非常小的区域。我将增量经度和增量纬度的默认值设置为 0.05。现在可以了。

        【讨论】:

          猜你喜欢
          • 2014-08-23
          • 2015-12-06
          • 1970-01-01
          • 1970-01-01
          • 2011-05-29
          • 1970-01-01
          • 2020-11-16
          • 2021-07-31
          • 1970-01-01
          相关资源
          最近更新 更多