我试图在MKMapItem
中显示多个位置。我从CLGeocoder
中获取这些位置,不幸的是它只接受一个位置。即使我传入NSArray
,它也只返回一个位置。
以下代码适用于单个位置,但不适用于多个位置。如何对多个位置进行地理编码?
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
NSArray *addresses = @[@"Mumbai",@"Delhi","Banglore"];
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@[addresses] completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:geocodedPlacemark.location.coordinate addressDictionary:geocodedPlacemark.addressDictionary];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];
[MKMapItem openMapsWithItems:@[mapItem] launchOptions:nil];
}];
}
字符串
3条答案
按热度按时间r6l8ljro1#
在回答你的问题时,你说你一次只能发送一个地理编码请求是正确的。事实上,CLGeocoder类参考说我们的应用程序应该“为任何一个用户操作发送最多一个地理编码请求”。
所以,要做到这一点,你必须发送单独的请求。但是这些请求(异步运行)不应该并发运行。所以,问题是如何使一系列异步地理编码请求一个接一个地顺序运行。
有很多不同的方法可以解决这个问题,但有一种特别优雅的方法是使用并发
NSOperation
子类,它不会完成操作(即不执行isFinished
KVN),直到调用地理编码请求的异步完成块。(有关并发操作的信息,请参阅 * 并发编程指南 * 操作队列一章的 * 配置并发执行操作 * 部分)然后将这些操作添加到串行操作队列中。另一种方法是使此异步地理编码请求以同步方式运行,然后您可以将请求添加到串行队列中,请求将按顺序执行而不是并行执行。您可以通过使用信号量来实现这一点,有效地指示调度任务在地理编码请求完成之前不会返回。您可以这样做:
字符串
或者,您也可以使用更传统的模式。例如,您可以编写一个方法来执行单个地理编码请求,并在完成块中启动下一个请求,并重复该过程,直到所有请求都完成。
628mspwn2#
对于正在寻找Swift解决方案的人:
字符串
感谢苹果官方文档link
您可以按以下方式将代码段用于多个地址:
型
vd2z7a6w3#
对于当代的Swift读者来说,
async
-await
大大简化了这个过程:字符串
Swift并发处理异步任务之间的依赖关系,比我们在X1 m2n1x中不得不做的旧
NSOperation
方法更优雅。或者,如果在Map上搜索,可能是
MKLocalSearch
:型
不用说,如上所述,多个地理编码请求的整个想法是一种反模式,在
CLGeocoder
documentation中明确不鼓励。