2

LBS アプリを実験しようとしたときに問題が発生しました。シミュレーターでテストすると、うまくいくようです。次に、iPhoneで試してみました。期待どおりに機能しませんでした。

アプリを起動すると、現在地の緯度、経度、距離などのすべての情報が表示されました。アプリを実行するか、iPhone を自動的にシャットダウン (その後、アプリを再度開く) しても、それらのデータは変更されません。

アプリをオフにして再起動すると、更新情報が表示されます。

これが私のコードです

viewDidLoad に CLLocationManager を設定しました

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

}

CLLocationManagerデリゲートのコードは次のとおりです

-(void)locationManager:(CLLocationManager *)manager 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];    
    }
}

}

  • (void)stopLocationManager{ [locationManager stopUpdatingLocation]; locationManager.delegate = nil; }

さて、以下の質問があります。

  1. CLLocationManager の設定で何が問題になっていますか? 以下に appDelegate (didFinishLaunchingWithOptions メソッドの下) を配置して、バックグラウンドで実行する必要がありますか? 電池の消耗が早いですか?または、ViewDidLoad の代わりに ViewWillAppear に設定しますか?

  2. 一方、「プルダウンしてリフレッシュ」をプログラムに入れました。更新されたデータは更新中に更新できると思いました。ただし、うまくいきません。これが私のリフレッシュコードです(リフレッシュ機能に EGOTableViewPullRefresh を入れました)。

    • (void)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 がリセットされ、ユーザーが更新中に場所の更新を開始することです。しかし、うまくいきませんでした。私のせいは何ですか?

すみません、質問がたくさんあります。誰かが私にアドバイスをくれれば幸いです。

4

2 に答える 2

0

あなたが何を望んでいるのか、正確にはわかりません。アプリを開いたときに場所のみを表示する場合は、startupdatinglocation 行を viewDidAppear に移動します。ホームに戻って更新するのに少し時間がかかるため、画面にアクティビティ インジケーターを表示します。

継続的に更新する場合は、stopUpdatingLocation を呼び出さないでください。マネージャーの設定に合わせて場所が変更されるたびに、デリゲート メソッドが起動されます。

もうひとつ気がついたこと

if (locationAge < 5.0) return;

あなたは 5.0 よりも優れていると言っているようですが、更新を取得するのにそれよりも時間がかかる場合は、別のものに応答することはありません。

マネージャーを繰り返し設定する代わりに、シングルトンを作成するか、プロパティに保存します。開始したら、必要に応じて更新を開始/停止するだけで済みます。

ここにある私のヒントのいくつかが役立つかもしれません。

TTLocationHandler GitHub リポジトリ

于 2013-05-21T01:21:18.093 に答える