私は、単一の割り当てられたオブジェクトでアプリ全体で気象データを変更/更新/リコールできるように、気象機能 (すべてを含む) のシングルトン クラスを作成しようとしています。
少し奇妙なバグを除いて、私はそれを機能させています。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 への呼び出しはヒットすらしていません (これが、デリゲート メソッドがヒットしていないと仮定している理由です)。
どんな入力でも大歓迎です!ありがとう!