11

我正在尝试使用新的 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;
}

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

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

4

4 回答 4

2

这是(或似乎是)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;
     }];
}
于 2015-09-02T05:50:49.983 回答
0

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

于 2016-08-09T08:23:26.843 回答
0

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

于 2016-06-02T14:55:01.357 回答
0

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

于 2015-07-26T00:52:10.113 回答