ReactiveCocoa :: Могу ли я подписаться на сигнал внутри createsignal?

У нас возникли проблемы с 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];
}

person Andres C    schedule 09.10.2014    source источник
comment
Вы проверили, что self.authorizationStatusSignal действительно отправляется дальше? Я попробовал ваш код, и он сработал.   -  person Ken Kuan    schedule 09.10.2014
comment
Привет, Кен, да, кажется, сигнал подключен нормально. Но почему-то выполненное никогда не попадает в блок подписчиков.   -  person Andres C    schedule 09.10.2014


Ответы (1)


После идеи, предложенной @kenKuan, мы сделали еще одну проверку, о которой не подумали. Проблема заключается в том, что sendError выполняется (хотя он не должен достигать этого экземпляра) до того, как мы сможем отправить завершенное сообщение. Таким образом, это предотвращает фактическую передачу сообщения sendcompleted подписчику.

person Andres C    schedule 09.10.2014