0

사용자가 지정한 간격으로 위치 업데이트가 필요한 iPhone 앱에서 작업 중입니다.그런 접근 방식을 사용하는 NSTimer와 함께 CLLocationManager의 부작용이 있습니까?

@implementation TestLocation 
- (void)viewDidLoad{ 
    if ([Utils getDataWithKey:TIMER_INTERVAL] == nil) { 
     [Utils saveDataWithKey:TIMER_INTERVAL withValue:@"60.0"]; 
    } 
    locationManager = [[[CLLocationManager alloc] init] autorelease]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation]; 
} 
- (void)startLocationManager:(NSTimer *)timer{ 
    [locationManager startUpdatingLocation]; 
    [timer invalidate]; 
    timer = nil; 
} 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    // Here is code to handle location updates... 
    [manager stopUpdatingLocation]; 

    // Timer will start getting updated location. 
    NSTimeInterval timeInterval = [[Utils getDataWithKey:TIMER_INTERVAL] doubleValue]; 
    [NSTimer scheduledTimerWithTimeInterval:timeInterval 
            target:self 
            selector:@selector(startLocationManager:) 
            userInfo:nil 
            repeats:NO]; 

} 
// other implementations ... 
@end 

코드는 마치 마법처럼 작동 : 는 여기에 내가이 일을 사용하고있는 코드 예제입니다. 나는 NSTimer와 함께 CLLocationManager을 사용하고

이 효과 메모리 또는 배터리 소비를 수행합니다

질문은? 사용자 환경에 부정적인 영향을 미칩니 까?

그렇다면 최적화를 통해 이러한 작업을 수행하는 링크의 도움을 받으십시오.

참고 :Utils은 데이터를 저장하거나 검색하는 클래스입니다.

+0

out of curiosty .. 어디에서 타이머를 startLocationManager ..로 전달합니까? –

+0

start location manger는 nstimer를 인수로 사용하지만 통과 된 userinfo는 nil이므로 아무런 인수도 보내지 않습니다. –

+0

타이머 자체는 iOS 프레임 워크에 의해 자동으로 전달됩니다. –

답변

1

네, 여기에는 몇 가지 부작용이 있습니다. 원하는 정확도를 얻지 못할 수도 있습니다. GPS 신호가 일 때마다 locationManager:didUpdateToLocation:fromLocation:을 호출 할 것이기 때문에 더 정확해질 것입니다.

1

처음으로 [manager stopUpdatingLocation]을 호출하기 전에 여러 비동기 위치 이벤트를 수신 할 수 있기 때문에 좋은 전략은 아닙니다. 기하 급수적으로 많은 타이머가 생성됩니다.

대신 위치 관리자를 만든 후에 반복 타이머를 시작하고 수신 된 각 이벤트 후에 위치 관리자를 중지하십시오.

+0

제안 해 주셔서 감사합니다. 나는 이미 Timer 로직을 벗었습니다. 여러분이 지적한 문제가 그곳에서 제기되었고 내 논리가 바뀌었기 때문입니다. 다시 한번 감사드립니다. –

관련 문제