我正在尝试在两个位置之间绘制路线。因为我有两个CLLocation
startPoin,endPoind的实例。我想将这两个位置转换为两个相应的位置地址。之后我想从谷歌地图webservice获取所有路线点。以下代码也是如此。
- (void)viewDidLoad{
[super viewDidLoad];
locations =[[NSMutableArray alloc]initWithCapacity:2];//For location Name
[self.mapView_MP setMapType:MKMapTypeStandard];
[self.mapView_MP setZoomEnabled:YES];
[self.mapView_MP setScrollEnabled:YES];
[self update:startPoint]; //MKReverseGeocoder start point
[self update:endPoint]; //MKReverseGeocoder end point
[self updateRoute];
}
- (void)update:(CLLocation*)loc{
MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:loc.coordinate];
geoCoder.delegate = self;
[geoCoder start];
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
NSMutableDictionary *cplace=[[NSMutableDictionary alloc]initWithDictionary:[placemark addressDictionary]];
// NSLog(@"The geocoder has returned: %@", [cplace objectForKey:@"FormattedAddressLines"] );
// NSLog(@"The geocoder has returned: %@", [cplace objectForKey:@"Street"] );
[locations addObject:[cplace objectForKey:@"SubAdministrativeArea"]];
NSLog(@"The geocoder has returned: %@", locations );
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
NSLog(@"reverseGeocoder:%@ didFailWithError:%@", geocoder, error);
}
- (void)updateRoute {
self.responseData=[NSMutableData data];
NSLog(@" string Formate.................................===%@",locations);
NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&mode=driving&sensor=false", [locations objectAtIndex:0],[locations objectAtIndex:1]]]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
在viewDidLoad中,我按顺序调用方法
[self update:startPoint]; //MKReverseGeocoder start point
[self update:endPoint]; //MKReverseGeocoder end point
[self updateRoute];
但不幸的是[self updateRoute];正在执行第一次比较MKReverseGeocoder
委托方法。这个方法的位置数组是null。获得EXEBADACCESS。我怎么能超过这个价值。
在MKReverseGeocoder
委托方法内,我得到了位置名称。 Delegate方法正在执行任何其他线程。
答案 0 :(得分:2)
MKReverseGeocoder
,因此您应该使用CLGeocoder
代替。
除此之外,是的,start
方法是异步,如文档中所示。这并不一定意味着您将在不同的线程上获得结果,但这意味着该方法通常会在结果可用之前返回。
您需要跟踪地理编码器,以便在两者都完成时调用updateRoute
方法。
答案 1 :(得分:1)
它是否在另一个线程上执行并不重要。重要的是,当你得到答复时,你无法控制。
您应该有一些逻辑说“当我获得开始和结束路线的值时,请调用我的updateRoute
方法”。您可以在获得startPoint
的值时检查endPoint
变量的值是否已设置(反之亦然),然后再调用updateRoute
函数。
答案 2 :(得分:0)
如果您仍然希望使用此功能,尽管这已被弃用....只有当[self updateRoute];
为2时,您才应在- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
中呼叫[locations count]
。
这样,当你同时拥有两个值时,将调用NSURLConnection。