目前我创建了一个内部信号来调用[Watchtower reportToServerWithBeaconRegionArraySignal:]
,因为这样我只能传递next
,并捕获完成和错误信号,我不想传播因为我想继续订阅来自[self rangedBeaconsSignal]
的更多信号。
我确定必须有更好的方法,但我无法看到它:我已尝试使用catch:
(并从提供的块中返回[RACSignal empty]
那里),但这只会导致错误,而不是完成。
(p.s。我可以在这里检查我对[disposable dispose]
的使用是否正确?可能它是多余的):
[[[self rangedBeaconsSignal] flattenMap:^RACStream * (CLBeaconRegion *region) {
return [RACSignal createSignal:^RACDisposable * (id <RACSubscriber> subscriber) {
RACDisposable *disposable= [RACDisposable new];
[[Watchtower reportToServerWithBeaconRegionArraySignal:@[region] fromBackground:NO]
subscribeNext:^(id x) {
[subscriber sendNext:x];
} error:^(NSError *error) {
[disposable dispose];
} completed:^{
[disposable dispose];
}];
return disposable;
}];
}] subscribeNext:^(id x) {
NSLog(@"Sent beacon to server");
} error:^(NSError *error) {
// ideally errors might reach here, but I don't want to unsubscribe, so I'm ignoring them for now.
} completed:^{
}];
答案 0 :(得分:1)
我认为找到答案,这对我有用。基本上completed
被捕获并被忽略,错误基于订阅者,然后使用catch:
(返回空)捕获,然后将其包装在-repeat
语句中,以便它不会不要放弃下一个范围的dBeacon。呜!
[[[[[self rangedBeaconsSignal]
flattenMap:^RACStream * (CLBeaconRegion *region) {
return [RACSignal createSignal:^RACDisposable * (id <RACSubscriber> subscriber) {
RACDisposable *disposable = [RACDisposable new];
[[Watchtower reportToServerWithBeaconRegionArraySignal:@[ region ] fromBackground:NO]
subscribeNext:^(id x) {
[subscriber sendNext:x];
} error:^(NSError *error) {
[subscriber sendError:error];
} completed:^{
[disposable dispose];
}
];
return disposable;
}];
}]
catch:^RACSignal * (NSError *error) {
NSLog (@"Caught server error..");
return [RACSignal empty];
}]
repeat] // means that it'll keep trying for the next ranged regions
subscribeNext:^(id x) {
NSLog(@"Sent beacon to server");
}];