2012-03-22 58 views
2

我有一個iOS應用程序女巫使用用戶的當前位置。我做這樣的:didUpdateToLocation調用多重

-(void)startGeoloc{ 

    NSLog(@"start geoloc"); 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy=kCLLocationAccuracyHundredMeters; 
    [locationManager startUpdatingLocation]; 
} 

#pragma mark - CLLocationManagerDelegate methods 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    [locationManager stopUpdatingLocation]; 
    AppDelegate *apDelegate =(AppDelegate *)[UIApplication sharedApplication].delegate; 
    apDelegate.modeGeoloc = YES; 
    [self callWebService:locationManager.location]; 

} 

這樣做的問題是,我的方法callWebService:locationManager.location被稱爲兩次,我想打電話給它只是一個時間。我該如何做到這一點?謝謝您的回答

回答

4

的LocationManager委託方法可以非常頻繁地調用(他們didUpdateToLocation所有的時間,對不對?:)

一種方法是讓你的callWebService有狀態,知道它是否正在執行的請求並且如果還在繼續,則忽略併發請求。另一種方法是保留一個時間戳,並且只有在自上一次以來已過去2分鐘時才允許。

11

爲了確保locationManager只調用一次「didUpdate ...」方法,如果找到該位置,請使用BOOL引用。

  1. 創建伊娃BOOL:

    @property BOOL didFindLocation; 
    
  2. 的LocationManager startUpdatingLocation之前,新的BOOL設置爲NO。這樣您就可以隨時呼叫新的位置更新。

    -(void) startFindingLocation { 
    
        self.didFindLocation = NO; // like this 
    
        locationManager = [[CLLocationManager alloc] init]; 
        [locationManager setDelegate:self] 
        [locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters]; 
        [locationManager startUpdatingLocation]; 
    } 
    
  3. 在「didUpdateLocations」中,檢查它。在你的代碼

    - (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 
    
        if (!self.didFindLocation) { 
         self.didFindLocation = YES; 
         [locationManager stopUpdatingLocation]; 
    
         // do the rest of your stuff 
    
        } 
    } 
    

如果可能的話,不設置didFindLocation其他地方,以避免混亂。

+2

這是一個這樣簡單的解決方案,不敢相信我沒有想到它。謝謝! – sridvijay 2013-07-13 20:26:05

+5

...給BOOL手機! – 2013-07-21 09:24:16

+0

這是一個很好的答案,但請注意,第一次通過didUpdateLocations可能會返回舊的存儲位置數據。在接受位置爲有效且當前之前,在didUpdateLocations中執行一些檢查,然後設置didFindLocation布爾值。 http://troybrant.net/blog/2010/02/detecting-bad-corelocation-data/ – mikemike396 2016-03-01 18:00:10

0

有同樣的問題。

我認爲最簡單的解決方案是將CLLocationManager設置爲null。

locationManager = nil; 

調用

[locationManager stopUpdatingLocation]; 
0

locationManager.startUpdatingLocation()之後,連續讀取的位置和didUpdateLocations方法調用locationManager.startUpdatingLocation前調用幾次, 只需設置爲locationManager.distanceFilter值()的值。

由於我設置了100米(您可以根據自己的需求進行更改)工作正常,並且會爲您工作。

locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.distanceFilter = 100 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
相關問題