MKReverseGeocoder委托方法是否在单独的线程上工作?

时间:2012-04-17 10:16:42

标签: iphone objective-c ios mkmapview mkreversegeocoder

我正在尝试在两个位置之间绘制路线。因为我有两个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方法正在执行任何其他线程。

3 个答案:

答案 0 :(得分:2)

在iOS 5中不推荐使用

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。