2

CLLocationManager現在、デリゲート呼び出しにタイムアウト機能を実装しようとしています。コードは次のとおりです。

- (void)checkInAt:(UALocation *)location timeout:(NSTimeInterval)timeout {
    NSDate *tickDate = [NSDate dateWithTimeIntervalSinceNow:timeout];
    self.locationManager = [[CLLocationManager alloc] init];

    self.timeout = [[NSTimer alloc] initWithFireDate:tickDate interval:0 target:self selector:@selector(timedOut:) userInfo:nil repeats:NO];
    [self.locationManager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    @synchronized (self.timeout) {
        // Todo what if the timer fires right now?
        // Is it even feasible? On what thread is CLLocationManager operating?
        if (self.timeout.isValid) {
            [self.timeout invalidate];
        }
        else {
            // Timed out
            return;
        }
    }

    [manager stopUpdatingLocation];
    // Do the actual check in
}

- (void)timedOut:(NSTimer *)timer {
    @synchronized (timer) {
        if (!timer.isValid) {
            return;
        }
    }
}

コードを読めば、おそらく私の質問にすでに出くわしたことでしょう。

  1. CLLocationManagerそのようなタイムアウトを実装 するためのより良い方法 (= に既に存在する) はありますか?
  2. CLLocationManagerデリゲートのメソッドを呼び出すスレッドはどれですか?
  3. それがメインスレッドでない場合、コメントが強調表示されるという問題が発生する可能性があります。どうすればそれを回避できますか?
4

1 に答える 1

3

メソッドにブレークポイントを追加するだけで、xcode の左側にどのスレッドがあるかが表示されます。

最初のスレッドはメインスレッド

ここに画像の説明を入力

于 2013-06-10T11:24:10.247 に答える