2014-10-29 92 views
0

目前我创建一个内部信号来呼叫[Watchtower reportToServerWithBeaconRegionArraySignal:],因为这样我只能通过next s,并捕获完成和错误信号,我不想传播,因为我想保留从[self rangedBeaconsSignal]进一步信号的订阅。我试过使用catch:(并且从那里提供的块返回[RACSignal empty]),但是它只捕获错误,而不是完成。但是我没有看到它:我尝试使用catch:(并从那里提供的块返回[RACSignal empty]),但只捕获错误,不完成。有没有更好的方法来捕获错误和完成?

(?附注:我能不能检查我使用[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:^{ 
    }]; 

回答

1

找到我想答案,这为我工作。基本上,completed被捕获并被忽略,错误是基于订户,然后使用catch:(返回空)捕获,然后将其封装在-repeat语句中,以便它不会放弃下一个rangedBeacon。呜!

[[[[[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"); 
     }]; 
相关问题