2017-04-25 83 views
0

考虑下面ReactiveSwift:重试了n次,然后执行一些代码

func test() -> SignalProducer<String, Error> { 
    return SignalProducer<String, Error> { observer, _ in 
     ... 
    } 
} 

test() 
    .on(value: { s in 
     print(s) 
    }) 
    .retry(upTo: 2) 
    .start() 
} 

代码是否有重试了N次,然后(如果它失败了所有的尝试)执行一些回调内置方式?

当然可以引入一个本地计数器并计算.on(failed: _)中的失败次数,然后在计数器等于n + 1时执行一些操作,但还有其他方法可以执行吗?

回答

2

retry(upTo:)一旦达到其重试限制就传递错误,因此您可以使用start方法之一来处理值和错误。例如,使用startWithResult你可以这样做(注意我没有测试此代码,但它应该给你的想法):

test() 
    .retry(upTo: 2) 
    .startWithResult { result in 
     switch result { 
     case let .success(value): 
      print(value) 
     case let .failed(error): 
      // handle error here 
     } 
    } 
+0

这里的关键是订单,加上之前的'.retry'的' .on'处理程序仅传递最后一个错误(在这种情况下为期望的效果)。我不知何故错过了这一点。 – Buddy

+1

是的,每个操作员实际上都会创建一个新的信号/生产者,用一些逻辑或转换来包装前一个。因此,在您的原始代码中重试会重试生产者,如前所有代码所定义的那样,其中包括“on”副作用。 – jjoelson