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

除了一个小怪异的bug,我有它的工作。我在运行iOS
在启动时,在应用程序委托中,创建天气单例的共享实例。除非有一个UIView期望报告天气结果,否则此实例不会执行任何操作。加载了报告天气的视图后,如果尚未在首选项中静态设置位置,则该应用会尝试提取您的当前位置。

这行得通,我可以记录设备当前位置的坐标。完成此操作后,我立即开始尝试对这些坐标进行反向地理定位。 MKReverseGeocoder start方法确实得到执行,并且我可以记录实例的isQuerying属性为true,因此我知道它正在尝试对坐标进行地理定位。 (是的,我将委托设置为我的共享实例,并且该实例的类型为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]);

                }
            }
        }];

    }
}


另外,我将reverserGeocoder设置为(非原子的,强的)属性并对其进行合成。请记住,这在第二次全新启动后(当已加载天气UIView时)可以正常工作。日志调用甚至都没有被击中(这就是为什么我假设委托方法没有被击中的原因)。

任何投入将不胜感激!
谢谢!

最佳答案

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

完美运作。

09-25 18:20