У нас возникли проблемы с CLLocationManager
работой с iOS8.
Идея состоит в том, что у нас есть LocationManager
, который обрабатывает все, что связано с местоположением. Начиная с iOS8 запрос разрешений является асинхронным, поэтому, когда мы пытаемся получить местоположение, мы, возможно, еще не получили разрешения.
Чтобы обойти это, мы хотим сделать это в два этапа:
- Сначала проверьте, есть ли у нас уже авторизация. Если да, сообщите об этом подписчику
completed
. - В противном случае начните обновление, которое запросит разрешение. Как только пользователь ответил, получите статус от обратного вызова. Если ДА, отправьте
completed
. Если НЕТ, отправьтеerror
.
В приведенном ниже коде self.authorizationStatusSignal
наблюдает за обратным вызовом didChangeAuthorizationStatus
, поэтому он будет срабатывать всякий раз, когда пользователь решит дать разрешение (или нет).
Дело в том, что при подписке на этот сигнал внутри метода создания subscriber
потерял ссылку, а completed
никогда не доставляется.
Можно ли так подписаться внутри творения? Мы пытались усилить его, но ничего не произошло.
- (RACSignal *)authorizationSignal {
return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
if ([self authorized:@([CLLocationManager authorizationStatus])]) {
[subscriber sendCompleted];
} else {
[self.authorizationStatusSignal subscribeNext:^(RACTuple * args) {
if ([self authorized:(NSNumber *)args.second]) {
[subscriber sendCompleted];
} else {
[subscriber sendError:nil];
}
}];
}
return nil;
}] replayLast];
}
self.authorizationStatusSignal
действительно отправляется дальше? Я попробовал ваш код, и он сработал. - person Ken Kuan   schedule 09.10.2014