1

私は、単一の割り当てられたオブジェクトでアプリ全体で気象データを変更/更新/リコールできるように、気象機能 (すべてを含む) のシングルトン クラスを作成しようとしています。

少し奇妙なバグを除いて、私はそれを機能させています。iOS < 5 を実行しているデバイスで MKReverseGeocoder を使用しています。CLGeocoder は iOS 5 以降で正常に動作します。基本的に、これはアプリで起こることです:

アプリ デリゲートでは、起動時に天気シングルトンの共有インスタンスを作成します。このインスタンスは、天気の結果を報告することを期待する UIView がない限り、何もしません。天気を報告するビューが読み込まれるときに、場所がまだ設定で静的に設定されていない場合、アプリは現在の場所を取得しようとします。

これは機能し、デバイスの現在位置の座標をログに記録できます。それが完了したら、すぐにそれらの座標の位置情報を逆にしようと試みます。メソッド MKReverseGeocoder start が実行され、インスタンスの isQuerying プロパティが true であることをログに記録できるため、座標を地理的に特定しようとしていることがわかります。(はい、デリゲートを共有インスタンスとして設定し、インスタンスのタイプは MKReverseGeocoderDelegate です)。

これが奇妙な部分です。アプリを初めて起動し、初めて天気 UIView を画面に追加すると、MKReverseGeocoder は起動しますが、デリゲート メソッドを呼び出すことはありません。その後、アプリを閉じて再度開くと (2 回目)、現在の場所が検索され、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 を (非アトミック、強力な) プロパティとして設定し、合成しています。これは、2 回目のクリーンな起動後 (既に読み込まれている天気 UIView がある場合) に正常に機能することを覚えておいてください。log への呼び出しはヒットすらしていません (これが、デリゲート メソッドがヒットしていないと仮定している理由です)。

どんな入力でも大歓迎です!ありがとう!

4

2 に答える 2

1

私はこれを理解することになりました...まあ、ちょっと。MKReverseGeocoder を使用する代わりに、iOS 4.3 で MKReverseGeocoder / PBHTTPStatusCode=503 エラーに対処するにはどうすればよいですか?

完璧に動作します。

于 2012-05-01T12:17:52.857 に答える
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);
            }

        }];
于 2012-05-01T12:21:20.620 に答える