2013-05-20 2 views
2

У меня возникла проблема, когда я попытался поэкспериментировать для приложения LBS. При тестировании в симуляторе это работает. Затем я попробовал его в iPhone. Это не сработало, как ожидалось.CLLocationManager не обновил данные правильно

Когда я запустил приложение, он отобразил всю информацию, такую ​​как широта, долгота, расстояние и т. Д. Однако эта информация не изменилась, когда я ушел. Либо запустите приложение, либо мой iPhone автоматически заткнись (затем снова откройте приложение), эти данные все еще не изменились.

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

Вот мой код

Я настроил CLLocationManager в viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //setup locationManager 
    locationManager =[[CLLocationManager alloc]init]; 
    locationManager.desiredAccuracy=kCLLocationAccuracyBest; 
    locationManager.distanceFilter=kCLDistanceFilterNone; 
    [locationManager setDelegate:self]; 
    [locationManager startUpdatingLocation]; 

} 

Вот код CLLocationManager делегатом

- (Недействительными) locationManager: (CLLocationManager *) менеджер didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation {

if (newLocation.horizontalAccuracy < 0) return; 

NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 

if (locationAge > 5.0) return; 


if (myLocation == nil || myLocation.horizontalAccuracy > newLocation.horizontalAccuracy) { 

    self.myLocation = newLocation; 
    // NSLog(@"mylocation=%@",self.myLocation); 
    [self.mainTableView reloadData]; 
    [self sortedDistArray];//this method is to calculate distance and put it in array. It work... 


    if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { 
     [self stopLocationManager];  
    } 
} 

}

  • (пустоты) stopLocationManager { [locationManager stopUpdatingLocation]; locationManager.delegate = nil; }

Теперь у меня есть следующие вопросы.

  1. Что случилось с моей настройкой CLLocationManager? Должен ли я помещать ниже в appDelegate (в методе didFinishLaunchingWithOptions), пусть он запускает его фон? Сможет ли это быстро разрядить аккумулятор? Или установить его в ViewWillAppear вместо ViewDidLoad?

  2. С другой стороны, я помещаю 'pull down to refresh' в программу. Я думал, что обновленные данные могут быть обновлены во время обновления. Однако это не сработает. Вот мой код обновления (я поставил EGOTableViewPullRefresh для функции обновления).

    • (аннулируются) reloadTableViewDataSource {

      // should be calling your tableviews data source model to reload 
          // put here just for demo 
      
      _reloading = YES; 
      
      locationManager =[[CLLocationManager alloc]init]; 
      locationManager.desiredAccuracy=kCLLocationAccuracyBest; 
      locationManager.distanceFilter=kCLDistanceFilterNone; 
      [locationManager setDelegate:self]; 
      [locationManager startUpdatingLocation]; 
      
      [self sortedDistArray]; 
      [mainTableView reloadData]; 
      
      [self doneLoadingTableViewData]; 
      

      }

Что моя мысль CLLocationManager сброса и запуска обновления местоположения во пользователей обновить его. Однако это не сработало. В чем моя ошибка?

Извините, у меня так много вопросов. Буду признателен, если кто-нибудь даст мне совет.

+0

Проверка документации сог Я думаю, что есть задержка по времени между двумя последовательными вызовами для местоположения. –

ответ

0

Вы не можете контролировать, когда предоставляются обновления местоположения, вы можете только запустить CLLocationManager, и ОС решит, когда он предоставит вам CLLocationManagerDelegate с обновлениями.

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

Кстати, в качестве примечания, я рекомендую вам обернуть CLLocationManager в одноэлементном классе. Если вы продолжаете запускать диспетчер местоположений, он будет работать во многих случаях с приложением и разряжать батарею (я не вижу в вашем коде, когда вы на самом деле останавливаете его). Запустите и остановите CLLocationManager по мере необходимости.

0

Непонятно, что именно вы хотите. Если вы хотите просто отобразить местоположение при открытии приложения, переместите строку startupdatinglocation в viewDidAppear. Отобразите индикатор активности на экране, так как потребуется некоторое время, чтобы войти и обновиться.

Если вы хотите, чтобы он постоянно обновлялся, не вызывайте stopUpdatingLocation. Он будет запускать метод делегата всякий раз, когда ваше местоположение изменится, чтобы соответствовать настройкам менеджера.

Другая вещь, которую я заметил, вы имели в виду сказать

if (locationAge < 5.0) return; 

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

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

Вы можете воспользоваться некоторыми из моих советов здесь:

TTLocationHandler GitHub Repository

+0

Я только что вернулся сюда, из-за моего ноутбука сломал T_T. Спасибо за ваши любезно посоветуйте. На самом деле, моя проблема заключается в том, что cllocation не может работать в какой-то подземной зоне. Работает ли TTLocationHandler в подземной зоне? Я просто хочу, чтобы пользователи могли запускать приложение в подполье (т. Е. Я не пытаюсь поворачивать по очереди на подземную зону). –

+0

еще одна вещь ... Я нашел метод, чтобы обернуть CLLocationManager в одноэлементный класс в Интернете. Ссылка http://jinru.wordpress.com/2010/08/15/singletons-in-objective-c-an-example-of-clocationmanager/....Надеюсь, что это поможет кому-то вроде меня –

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