我正在尝试使用新的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;
}
在大多数情况下,这很有效。但有时,似乎设备因地图请求而过载,然后停止渲染。在我的日志文件中,我将看到关于“已分配的Snapshotter”的第一个日志语句,但从未看到“Snapshotter完成块”消息。
我的请求是否可能永远不会从调度队列中执行? 有没有人遇到过这个问题?
答案 0 :(得分:2)
这是(或似乎是)MKMapSnapshotter中的错误。
如果关闭网络数据和WiFi,将不会调用完成处理程序(除非操作系统中有缓存数据 - 请参阅https://stackoverflow.com/a/5769108/481207以清除缓存)。
实际上,快照程序似乎阻止了等待数据。它不会超时或检测到没有数据。几分钟后,例如15分钟,snapshotter.isLoading = YES
。调用cancel
不会导致调用完成处理程序。
如果重新打开WiFi或网络数据,后续启动(新)快照程序的调用将调用完成处理程序。
如果在处理程序中启动并清除快照程序时设置了变量,则此s *会很严重,因为该变量永远不会被清除。
if (!isRendering) {
isRendering = YES;
[snapshotter startWithCompletionHandler:
^(MKMapSnapshot* snapshot, NSError* error) {
// This may not be called so this code will
// never run again.
isRendering = NO;
}];
}
答案 1 :(得分:0)
由于snapshotter不是属性,因此可能会出现此问题,因此在离开此范围后很快就会自动释放。将快照程序保留为属性应修复它。
答案 2 :(得分:0)
在不同的iOS版本中存在相同的问题。关键是AppleMaps应用程序也没有正确加载地图。重新启动设备让它工作。所以我想这是一个Apple bug。
答案 3 :(得分:0)
我有同样的问题。原因是在MKMapSnapshotOptions中我设置了非常小的区域。我将delta经度和delta纬度的默认值设置为0.05。现在它有效。