2012-02-26 8 views
0

私は、iOS 5でCLGeocoderオブジェクトを使用してジオコードを転送し、結果のCLLocationをインスタンス変数に入れようとしています。何らかの理由で、インスタンス変数を設定してからゲッターを呼び出すことはできますが、変数はジオコーダーの完了ハンドラーの範囲外でその値を失います。値を保持しないインスタンス変数

私は自分の.hファイルで変数を宣言:

@synthesize specifiedPosition = _specifiedPosition; 

をしてから、このようジオコーダを使用しようとした - 最初のNSLogリターンを:私.Mでそれを合成した後

@property (nonatomic, strong) CLLocation *specifiedPosition; 

緯度と経度は表示されませんが、2番目の表示はありません:

-(void)getLatLong:(NSString *)locationText 
{ 

if (!self.geocoder) 
{ 
    self.geocoder = [[CLGeocoder alloc] init]; 
} 

[self.geocoder geocodeAddressString:locationText completionHandler:^(NSArray *placemarks, NSError *error){ 

    if (([placemarks count] > 0) && (error == nil)) { 

     self.specifiedPosition = [[placemarks objectAtIndex:0] location]; 
     NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition); 


    } else if (error == nil && [placemarks count] == 0){ 
     // TODO 
     NSLog(@"Can't find data on the specificed location"); 
    } 
    else if (error != nil){ 
     // TODO 
     NSLog(@"An error occurred = %@", error); 
    } 

}]; 

NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition); 

} 

私はカスタムセッターも試しましたが、それはh elp:

-(void)setSpecifiedPosition:(CLLocation *)specifiedPosition 
{ 
    _specifiedPosition = specifiedPosition; 
} 

ご協力いただきありがとうございます。

答えて

0

私は、この特定のAPIに精通していないんだけど、それは非常に強くcompletionHandlerと呼ばれるブロックを取っているという事実は、これが非同期操作であることを示唆しています。つまり、ブロックはの後に(実行ループから)呼び出されます。ソースコード内の2番目のNSLogより先にcompletionHandlerが呼び出されているので、まだ発生していないので、割り当ては表示されません。

指定された位置データを取得したら、何をする必要がありますか?completionHandlerブロック内、-setSpecifiedPosition:の中、またはそれらのいずれかによって通知/トリガー/コールされる場所で行う必要があります。

+0

私はそれが正しいと思う - タイムスタンプを見て、それらが順不同であることを明らかにする。ありがとうございました!!! – AlexSBerman

+1

@AlexSBerman喜んで私は助けることができます。問題が解決された場合は、チェックマークをクリックしてこの回答を受け入れてください。 –

関連する問題