ReactiveCocoa ::我可以在creatignal中订阅信号吗?

时间:2014-10-09 14:02:58

标签: ios objective-c ios8 reactive-cocoa

我们在试图让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];
}

1 个答案:

答案 0 :(得分:1)

在@kenKuan提出的想法之后,我们做了另一个没想过的检查。问题在于正在执行的sendError(尽管它不应该到达该实例),然后才能实际发送完成。这样,它可以防止sendcompleted实际到达订户。