【问题标题】:ReactiveSwift action observeResult doesn't return failure like it should beReactiveSwift 操作 observeResult 不会像它应该的那样返回失败
【发布时间】:2017-04-26 23:05:04
【问题描述】:

现在我对 ReactiveSwift 很感兴趣,并尝试将它添加到项目的网络操作中。但是observeResult方法的action返回类型存在一些问题。

查看模型:

final class TestViewModel: ViewModel {

    var getListAction: Action<Void, Void, APIError>!

    var arr = NSMutableArray()

    override init() {

        super.init()

        self.getListBuild()

    }

    func getListBuild() {

        getListAction = Action<Void, Void, APIError> { _ in
            let signalProducer = SignalProducer<Void, APIError> { observer, disposable in
                self.getList(observer)
            }
            return signalProducer
        }

        getListAction.apply().start()
    }


    func getList(_ observer: Observer<Void, APIError>) {

        Network<UserDetailInfo>().requestList(router: RegistrationRouter(endpoint:.Login())).take(during: lifetime).startWithResult { (result) in
            switch result {
            case let .success(value):
                self.arr = value as! NSMutableArray
                print("success")
                observer.sendCompleted()
            case let .failure(error):
                print("abort: \(String(describing: error.message))")
                observer.send(error: error)
            }
        }
    }
}

从控制器我试图这样管理它:

final class ViewController: View {

    var viewModel: TestViewModel?

    func bindViewModel() {

        self.viewModel = TestViewModel()

        self.viewModel?.getListAction.events.take(during: lifetime).observeResult { (result) in
            switch result {
            case .success(_):
                print("success")
                print(self.viewModel?.arr.count as Any)
                break
            case let .failure(error):
                print(error.localizedDescription);
                break
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.bindViewModel()
    }
}

尽管从 viewModel 中的 getList 方法返回失败,但情况如下:

方法返回成功,但事实并非如此。应该是失败。请让我了解一下这个主题的问题所在。

【问题讨论】:

    标签: swift xcode return action reactive-cocoa


    【解决方案1】:

    您观察到的event 流永远不会返回失败。查看其文档:

    /// A signal of all events generated from applications of the Action.
    ///
    /// In other words, this will send every `Event` from every signal generated
    /// by each SignalProducer returned from apply() except `ActionError.disabled`.
    public let events: Signal<Event<Output, Error>, NoError>
    

    要观察成功的值,您需要订阅values 并使用observeValues:

    self.viewModel?.getListAction
       .values
       .take(during: lifetime)
       .observeValues { [weak self] value in
          // always successful
       }
    

    如果你想观察错误,可以订阅errors并使用observeValues。

    self.viewModel?.getListAction
       .errors
       .take(during: lifetime)
       .observeValues { [weak self] error in
          // error event
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2020-01-20
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多