Я пытаюсь реализовать (не одновременную) операцию NSO для обновлений местоположения с помощью iPhone SDK.«Мясо» подкласса NSOperation выглядит примерно так:
- (void)start {
// background thread set up by the NSOperationQueue
assert(![NSThread isMainThread]);
if ([self isCancelled]) {
return;
}
self->locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = self->desiredAccuracy;
locationManager.distanceFilter = self->filter;
[locationManager startUpdatingLocation];
[self willChangeValueForKey:@"isExecuting"];
self->acquiringLocation = YES;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)cancel {
if ( ! self->cancelled ) {
[self willChangeValueForKey:@"isCancelled"];
self->cancelled = YES;
[self didChangeValueForKey:@"isCancelled"];
[self stopUpdatingLocation];
}
}
- (BOOL)isExecuting {
return self->acquiringLocation == YES;
}
- (BOOL)isConcurrent {
return NO;
}
- (BOOL)isFinished {
return self->acquiringLocation == NO;
}
- (BOOL)isCancelled {
return self->cancelled;
}
- (void)stopUpdatingLocation {
if (self->acquiringLocation) {
[locationManager stopUpdatingLocation];
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
self->acquiringLocation = NO;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
locationManager.delegate = nil;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
assert(![NSThread isMainThread]);
// ... I omitted the rest of the code from this post
[self stopUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)theError {
assert(![NSThread isMainThread]);
// ... I omitted the rest of the code from this post
}
Теперь в главном потоке я создаю экземпляр этой операции и добавляю его в NSOperationQueue.Вызывается метод start, однако не вызывается ни один из -locationManager:...
методов делегата.Я не понимаю, почему их никогда не вызывают.
Я заставил интерфейс придерживаться протокола <CLLocationManagerDelegate>
.Я позволяю NSOperationQueue управлять потоком для этой операции, поэтому все должно соответствовать документации CLLocationManagerDelegate:
Методы вашего объекта делегата вызываются из потока, в котором вы запустили соответствующийсервисы определения местоположения.Этот поток должен сам иметь активный цикл выполнения, такой как тот, который находится в основном потоке вашего приложения.
Я не уверен, что еще можно попробовать, чтобы это работало.Может быть, это смотрит мне в лицо ... Любая помощь приветствуется.
Заранее спасибо!