-1

ビューがロードされた状態でタイマーを開始しています

- (void)viewDidLoad
{
[super viewDidLoad];
locationManager.delegate = 自己;
[NSTimerscheduledTimerWithTimeInterval: 10.0 //ここでの間隔は float
ターゲットでなければなりません: self
selector:@selector(onTick:)
userInfo: nil repeats:YES];
}

それから私は私のタイマーメソッドを持っています:

-(void)onTick:(NSTimer *)timer {
[locationManager startUpdatingLocation];

}

次に、デリゲートであるため、ロケーション マネージャーが呼び出されます。

-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"ロケーション マネージャーにした");

NSTimeInterval timePassedSinceLastLocationUpdate = fabs([oldLocation.timestamp timeIntervalSinceNow]);

NSLog(@"更新時刻: %f", timePassedSinceLastLocationUpdate);

NSLog(@"--------------");
//その他のことが起こり
ます [locationManager stopUpdatingLocation];
}

ただし、表示される NSLOG は次のとおりです。


2012-07-31 13:02:28.092 round5[1713:f803] はロケーション マネージャーに
到達しました
28.095 round5[1713:f803] --------------
2012-07-31 13:02:33.298 round5[1713:f803] はロケーション マネージャーに到達しました
2012-07-31 13:02 :33.298 round5[1713:f803] 更新時間: 5.222202
2012-07-31 13:02:33.300 round5[1713:f803] --------------
2012-07-31 13:02 :44.086 round5 [1713:f803] ロケーションマネージャーに
到達
-------------
2012-07-31 13:02:53.297 round5[1713:f803] ロケーションマネージャーに到達しました
2012-07-31 13:02:53.302 round5[1713:f803]更新時間: 9.217123
2012-07-31 13:02:53.303 round5[1713:f803] --------------
2012-07-31 13:03:04.096 round5[1713:f803] がその場所に到達しましたマネージャー
2012-07-31 13:03:04.097 round5[1713:f803] 更新時間: 20.007919
2012-07-31 13:03:04.098 round5[1713:f803] ------------- - 2012-07-31
13:03:13.297 round5[1713:f803] がロケーション マネージャーに
到達
:13.300 round5[1713:f803] --------------
2012-07-31 13:03:24.111 round5[1713:f803] はロケーション マネージャーに到達しました
2012-07-31 13: 03:24.112 round5[1713:f803] 更新時間: 20.012550
2012-07-31 13:03:24.113 round5[1713:f803] --------------

下部に向かって見ることができるように、パターンは正規化され、〜10秒を読み取ります(これは、間隔が設定され、システムクロックと比較されるためです)

そして20...どこから来たのかわかりません。

私の質問は、「なぜ常に 10 秒を読み取らないのか、なぜ NStimer の値が 2 倍になるのか?」ということだと思います。

どうもありがとう!

4

2 に答える 2

5

ここには2つの間違いがあります。startUpdatingLocationまず、繰り返し電話するべきではありません。更新が利用可能になったら、一度呼び出して更新の要求を開始する必要があります(その後、stopUpdatingLocation更新が不要になったときに呼び出す必要があります)。2つ目の間違いは、電話をかけるstartUpdatingLocationと常に新しい場所が返されると信じていることです。前回チェックしていませんNSTimer ranCLLocationManager場所を最後に更新した時刻を確認しています( oldLocation.timestamp)。これは任意の時間にすることができます。前回リクエストしたときにアップデートを取得できなかった可能性があります。あなたがそれを求めなかった時にそれは更新されたかもしれません。

LocationAwarenessプログラミングガイドをお読みください。更新を要求する方法と更新を要求するタイミングについて説明します。通常、これをオンにして、更新がどれだけ正確であるかをシステムに伝えます。次に、状況が変化したときにシステムに電話をかけさせます。位置情報の更新を繰り返し要求することはありません。

于 2012-07-31T20:14:56.333 に答える
1
- (void)viewDidLoad
{
    [super viewDidLoad];
    locationManager = [[CLLocationManager alloc] init];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locationManager setDelegate:self];
    [locationManager setDistanceFilter:2.0];
    [locationManager startUpdatingLocation];
    [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(useLocation) userInfo:nil repeats:YES];
}

-(void)useLocation{
    NSLog(@"%@",[locationManager location]);
}

デリゲートメソッドに実際にコードを実装する必要はありません。[locationManager location]メソッドは現在の場所を返し、distanceFilterを設定すると、(2)メートル移動した場合に現在地が更新されます(オンボードGPSはそれでいいですか?)。そのため、場所が変更されるとすぐに、場所のプロパティが自動的に更新されます。これは私が通常それを実装する方法です。

参考:iOSプログラミング:Big Nerd Ranch Guide 3rd Edition、Chapter 4

于 2012-07-31T22:13:40.090 に答える