我们在试图让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];
}
答案 0 :(得分:1)
在@kenKuan提出的想法之后,我们做了另一个没想过的检查。问题在于正在执行的sendError(尽管它不应该到达该实例),然后才能实际发送完成。这样,它可以防止sendcompleted实际到达订户。