在单例类(ARC)中使用MKReverseGeocoder

时间:2012-04-30 13:48:41

标签: objective-c ios xcode singleton reverse-geocoding

我正在尝试为天气功能(包括所有内容)创建一个单例类,以便我可以在一个已分配的对象中更改/更新/调用整个应用程序中的天气数据。

除了一个小怪异的bug之外,我有它的工作。我在运行iOS<的设备上使用MKReverseGeocoder 5. CLGeocoder在iOS 5+上运行良好。基本上,这是应用程序中发生的事情:

在app delegate中,在启动时,我创建了我的天气单例的共享实例。除非有一个希望报告天气结果的UIView,否则此实例不会执行任何操作。当加载报告天气的视图时,如果该位置尚未在首选项中静态设置,则该应用会尝试提取您当前的位置。

这个工作,我可以记录设备当前位置的坐标。完成后,我立即尝试反转地理定位这些坐标。 MKReverseGeocoder start的方法确实执行了,我可以记录实例的isQuerying属性是真的,所以我知道它试图对coords进行地理定位。 (是的,我将委托设置为我的共享实例,实例的类型为MKReverseGeocoderDelegate)。

现在这是奇怪的部分。如果我是第一次启动应用程序,并且我第一次在屏幕上添加天气UIView,则MKReverseGeocoder启动但从不调用委托方法。如果我然后关闭应用程序并再次打开它(第二次),则查找当前位置,并且MKReverseGeocoder会调用委托方法,一切正常。它只是不想在第一次启动时工作,无论我多少次调用它(我有一个可以启动查找的按钮)。

这完全令人费解。 iOS 5 CLGeocoder在初始启动和每次后续启动时都能正常工作。 MKReverseGeocoder在初始启动时不起作用(因为它不调用委托方法),但在后续启动时不起作用。

以下是相关代码:

-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error{

    NSLog(@"error getting location:%@", error);
    self.reverseGeocoder = nil;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"errorGettingLocation" object:nil userInfo:[NSDictionary dictionaryWithObject:error forKey:@"error"]];

}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)pm
{
    //update placemark and get weather from correct placemark
    placemark = pm;
    NSLog(@"singleton placemark: %@",placemark);
    [self getLocationFromPlacemark];
    self.reverseGeocoder = nil;
}


- (void) getReverseGeoCode:(CLLocation *)newLocation
{
    NSLog(@"reversGeocode starting for location: %@", newLocation);
    NSString *ver = [[UIDevice currentDevice] systemVersion];
    float ver_float = [ver floatValue];
    if (ver_float < 5.0) {
        //reverseGeocoder = nil;
        self.reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
        self.reverseGeocoder.delegate = self;
        [self.reverseGeocoder start];
        if(self.reverseGeocoder.isQuerying){
            NSLog(@"self.reverseGeocoder querying");
            NSLog(@"self.reverseGeocoder delegate %@", self.reverseGeocoder.delegate);
            NSLog(@"self %@", self);
        }else {
            NSLog(@"geocoder not querying");
        }
    }
    else {
        [reverseGeocoder5 reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error){


            if([placemarks count]>0){
                placemark = [placemarks objectAtIndex:0];
                [self getLocationFromPlacemark];
            }
            else{
                if (error) {
                    NSLog(@"error reverseGeocode: %@",[error localizedDescription]);

                }
            }
        }];

    }
}

另外,我将reverseerGeocoder设置为(非原子,强)属性并进行合成。请记住,第二次干净启动后(当天气UIView已经加载时),此功能正常。对日志的调用甚至没有被命中(这就是为什么我假设代理方法没有被命中)。

任何输入都会非常感激! 谢谢!

2 个答案:

答案 0 :(得分:1)

我最终搞清楚了......好吧,好吧。 而不是使用MKReverseGeocoder,我只是对谷歌地图进行静态查找ala How to deal with MKReverseGeocoder / PBHTTPStatusCode=503 errors in iOS 4.3?

完美无缺。

答案 1 :(得分:0)

MKReverseGeocoder不再存在......在iOS 5中 您必须导入CoreLocation并使用CLGeocoder。以下是一些示例示例代码:

                  CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
        CLLocation *location = [[CLLocation alloc] initWithLatitude:37.33188 longitude:-122.029497];

        [geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemark, NSError *error) {
            CLPlacemark *place = [placemark objectAtIndex:0];
            if (error) {
                NSLog(@"fail %@", error);

            } else {
                NSLog(@"return %@", place.addressDictionary);
            }

        }];