2011-12-29 2 views
0
@implementation MyLocation 


SYNTHESIZE_SINGLETON_FOR_CLASS(MyLocation); 

@synthesize delegate, locationManager; 

- (id) init 
{ 
    self = [super init]; 
    if (self != nil) 
    {  
     self.locationManager = [[[CLLocationManager alloc] init] autorelease]; 

     self.locationManager.delegate = self; 
    } 
    return self; 
} 


- (void) timeoutHandler:(NSTimer *)_timer 
{ 

    timer = nil; 

    [self update_location]; 
} 

-(void) update_location 
{ 
    hasLocation=NO; 

    [locationManager startUpdatingLocation]; 

    timer = [NSTimer scheduledTimerWithTimeInterval: 3.0 
             target: self 
             selector: @selector(timeoutHandler:) 
             userInfo: nil 
             repeats: NO 
     ]; 
} 


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"location ready"); 
    if(timer != nil) { 
     [timer invalidate]; 
     timer = nil; 
    } 
    hasLocation = YES; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"location_ready"       object:nil]; 


    if (debug_switch) 
     NSLog(@" Delegate function, Getting new location from locationManager from Mylocation.m"); 


    _coordinate = newLocation.coordinate; 

    source_lat=_coordinate.latitude; 
    source_lng=_coordinate.longitude; 

    //TRACE(@"new location: %f %f", _coordinate.latitude, _coordinate.longitude); 
    //[delegate locationUpdate:newLocation.coordinate]; 

} 

В первый раз я запустил подпрограмму update_location, менеджер местоположений быстро перешел на процедуру обратного вызова didupdatetolocation. Нет проблемыНепоследовательное locationManager didupdatetolocation на Iphone

Однако в следующий раз, когда я снова вызову функцию update_location, callback didupdatetolocation никогда не вводился. Почему такое несоответствие? почему обратный вызов не введен?

ответ

2

Неправильное использование LocationManager. Вам нужно только один раз вызвать startUpdatingLocation, и обратный вызов будет вызван повторно, когда произойдет достаточно большое изменение.

В связи с тем, что с вашим наблюдением, вероятно, не было существенных изменений для вызова обратного вызова.

+0

Хорошо, если я не изменить свое местоположение бы, что обратного вызова вызывается снова? – lilzz

+0

Обратный вызов НЕ будет вызываться до тех пор, пока местоположение не изменится. Иногда это происходит особенно внутри здания, но это связано с флуктуацией самого сигнала GPS (поэтому обратный вызов даст вам измененное местоположение). – barley

+0

И обратный вызов будет вызван сразу после вызова startUpdatingLocation, даже если вы не изменили местоположение. Я думаю, что в вашем исходном коде второй и более поздний startUpdatingLocation-вызов просто игнорируется. (Это мое лучшее предположение, я не пробовал вызывать startUpdatingLocation несколько раз.) – barley

0

Зачем создавать таймер, который вызывает вызов CLLocationManager startUpdatingLocation?

CLLocationManager обычно используется, устанавливая себя как делегат. запустите его, а затем вы получите обратные вызовы при изменении местоположения.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

Вот учебник, показывающий, как использовать его:

http://mobileorchard.com/hello-there-a-corelocation-tutorial/

Смежные вопросы