iOS MKMapShapshotter完成块并不总是被调用
我正在尝试使用新的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 completion block”消息。
我的请求可能永远不会从调度队列中执行吗? 有没有人有这个问题?
这是(或似乎是)MKMapSnapshotter中的错误。
如果closuresnetworking数据和WiFi, 则不会调用完成处理程序 (除非操作系统中存在高速caching的数据 – 请参阅https://stackoverflow.com/a/5769108/481207以清除高速caching)。
事实上,快照似乎阻止等待数据。 它不会超时或检测到没有数据。 多分钟后,例如15分钟, snapshotter.isLoading = YES
。 调用cancel
不会导致完成处理程序被调用。
如果WiFi或networking数据重新打开,后续调用启动(新)快照程序将调用完成处理程序。
如果在处理程序中启动并清除快照程序时设置了variables,则此操作会很糟糕,因为variables永远不会被清除。
if (!isRendering) { isRendering = YES; [snapshotter startWithCompletionHandler: ^(MKMapSnapshot* snapshot, NSError* error) { // This may not be called so this code will // never run again. isRendering = NO; }]; }
这个问题可能是由于snapshotter不是一个属性,所以在离开这个范围之后很快就会自动释放。 保留snapshotter作为属性应该修复它。
在不同的iOS版本中有相同的问题。 问题是AppleMaps应用程序也没有正确加载地图。 重新启动设备让它工作。 所以我想这是一个苹果的错误。
我有同样的问题。 原因是在MKMapSnapshotOptions我设置了很小的区域。 我将delta经度和delta纬度的默认值设置为0.05。 现在起作用了。