我正在尝试使用新的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;
}
在大多数情况下,这效果很好。但是,有时设备似乎因地图请求而过载,然后停止渲染。在我的日志文件中,我将看到有关"已分配快照程序"的第一个日志语句,但永远不会看到"快照程序完成块"消息。
我的请求是否有可能永远不会从调度队列中执行?有没有人遇到过这个问题?
(或似乎是)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;
}];
}
可能是由于快照器不是属性,因此在离开此范围后不久就会自动发布。将快照程序保留为属性应该可以修复它。
在不同的iOS版本中遇到相同的问题。关键是AppleMaps应用程序也没有正确加载地图。重新启动设备很难让它工作。所以我想这是一个苹果错误。
我有同样的问题。原因是在MKMapSnapshotOptions中,我设置了非常小的区域。我将增量经度和增量纬度的默认值设置为 0.05。现在它起作用了。