Получение обновлений Cllocation на фоновой резьбе
-
25-09-2019 - |
Вопрос
Я пытаюсь реализовать (не одновременно) NSOPARA для обновлений местоположения с использованием 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
}
Теперь, на главной поток я создаю экземпляр этой операции и добавить его в NSOPERURICEUE. Метод запуска вызывается, однако ни один из -locationManager:...
Делегированные методы вызваны. Я не понимаю, почему они никогда не вызываются.
Я сделал интерфейс придерживаться <CLLocationManagerDelegate>
протокол. Я позволяю NSOperatureue управлять нитью для этой операции, поэтому все должно соответствовать документации CllocationManagerDelegate:
Методы вашего объекта делегата вызываются из потока, в которой вы начали соответствующие службы расположения. Эта нить должна сама иметь активную петлю прогона, например, найден в основном потоке вашего приложения.
Я не уверен, что еще попробовать для этого работать. Может быть, он смотрит на меня в лицо ... Любая помощь ценится.
Заранее спасибо!
Решение
Вы отсутствуете в разделе «Активный цикл бега». В конце вашего старта добавить:
while (![self isCancelled])
[[NSRunLoop currentRunLoop] runUntilDate:someDate];