使用RxSwift的retryWhen运算符提示用户重试或取消

时间:2016-11-23 22:24:30

标签: ios swift rx-swift

我正在尝试使用MVVM架构制作iOS应用。现在我想要的是,如果观察失败,我将向用户显示询问他是否要取消或重试的提示。使用retryWhen这应该很简单,但永远不会调用重试。这是我的代码:

.retryWhen({ (errorObservable: Observable<Error>) -> Observable<Error> in
  return promptFor("test", cancelAction: RetryResult.cancel, actions: [RetryResult.retry])
    .flatMap { action -> Observable<Error> in
      switch action {
      case .retry:
        return errorObservable
      case .cancel:
        return errorObservable.flatMap { Observable.error($0) }
      }
    }
})

提示只是我从RxSwiftExample中获取的一个方法,可以在repo中找到,但为了方便起见,它是:

func promptFor<Action : CustomStringConvertible>(_ message: String, cancelAction: Action, actions: [Action]) -> Observable<Action> {
#if os(iOS)
    return Observable.create { observer in
        let alertView = UIAlertController(title: "RxExample", message: message, preferredStyle: .alert)
        alertView.addAction(UIAlertAction(title: cancelAction.description, style: .cancel) { _ in
            observer.on(.next(cancelAction))
        })

        for action in actions {
            alertView.addAction(UIAlertAction(title: action.description, style: .default) { _ in
                observer.on(.next(action))
            })
        }

        (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController?.present(alertView, animated: true, completion: nil)

        return Disposables.create {
            alertView.dismiss(animated:false, completion: nil)
        }
    }
#elseif os(macOS)
    return Observable.error(NSError(domain: "Unimplemented", code: -1, userInfo: nil))
#endif

任何人都可以解释为什么这不起作用?甚至提供解决方案?

0 个答案:

没有答案