2012-02-26 189 views
0

我試圖在iOS 5中使用CLGeocoder對象將地址轉換爲地址,並將結果CLLocation放入實例變量中。出於某種原因,我可以設置實例變量,然後調用它的getter,但是該變量的值超出了Geocoder完成處理程序的範圍。實例變量不保留值

我宣佈我的.h文件中的變量:

@property (nonatomic, strong) CLLocation *specifiedPosition; 

然後在我的.m合成它:

@synthesize specifiedPosition = _specifiedPosition; 

然後試圖用這樣的地理編碼器 - 第一NSLog的回報緯度和經度,而第二個沒有:

-(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); 

} 

我也嘗試了定製的setter,但這不是H elp:

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

在此先感謝您的幫助!

回答

0

我對這個特定的API並不熟悉,但事實上它採用了一個名爲completionHandler的塊,這非常強烈地表明這是一個異步操作。也就是說,你的塊將被調用以後的(來自運行循環)。源代碼中的第二個NSLog正在發生之前completionHandler被調用,所以它當然看不到任務,因爲它還沒有發生。

無論你需要做的,一旦你有specifiedPosition數據,你應該這樣做要麼completionHandler塊內的-setSpecifiedPosition:,或別的地方內部的通知/觸發/由其中的一個調用。

+0

我認爲這是正確的 - 看看時間戳顯示它們失靈。謝謝!!! – AlexSBerman 2012-02-26 23:44:06

+1

@AlexSBerman很高興能幫到你。如果事實證明解決了您的問題,請單擊複選標記以接受此答案。 – 2012-02-26 23:45:32