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;
}
}
}
コードを読めば、おそらく私の質問にすでに出くわしたことでしょう。
CLLocationManager
そのようなタイムアウトを実装 するためのより良い方法 (= に既に存在する) はありますか?CLLocationManager
デリゲートのメソッドを呼び出すスレッドはどれですか?- それがメインスレッドでない場合、コメントが強調表示されるという問題が発生する可能性があります。どうすればそれを回避できますか?