RxSwift 观察模型的变化并提出请求

Posted

技术标签:

【中文标题】RxSwift 观察模型的变化并提出请求【英文标题】:RxSwift Observe changes on model and Make request 【发布时间】:2019-01-28 12:05:10 【问题描述】:

我正在尝试学习 RxSwift 概念,但不幸的是被卡在了某个地方。我的TabBarController 连接了两个不同的屏幕。在我的SettingsViewController 上,我得到了两个字符串值并创建了一个模型,在TransactionListViewController 上,我需要观察变化并提出一个新的请求来填充列表。

在父标签栏控制器上,我有一个变量,当 didLoadCall 我使用 wallet.asObservable().subscribe 订阅此模型时

SettingViewController 上,当用户按下登录按钮时,我正在尝试使用以下代码更改 UserModel:

if let tabBar = parent?.parent as? TransactionTabBarController
   Observable.just(wallet).bind(to: tabBar.wallet)

我意识到 wallet.asObservable().subscribe 的 onNext 函数正在调用。

我的TransactionListViewController上还有另一个钱包型号, 在 viewDidLoad 函数上,我正在运行此代码:

wallet.asObservable().subscribe(onNext:  (wallet) in
   APIClient.getTransaction(address: wallet.walletAddress)
      .observeOn(MainScheduler.instance)
      .subscribe(onNext:  (model) in
          self.changeModels(items: model.result)
          .bind(to: self.transactionTableView.rx.items(dataSource: self.dataSource))
          .disposed(by: self.disposeBag)
       )
   .disposed(by: self.disposeBag), onError: nil, onCompleted: nil, onDisposed: nil)
.disposed(by: disposeBag)

我尝试在 TabBar 的 onNext 函数上设置钱包,但我在 TransactionListViewController 上迷恋了几次。

谁能帮我解决这个问题?

【问题讨论】:

您能先描述一下您的需求并提供崩溃的背景吗? 【参考方案1】:

遗憾的是,您的代码示例难以理解。但是,您似乎在询问如何在通过选项卡栏视图控制器连接的两个视图控制器之间传输数据。以下是您可以这样做的一种方法...

要使用此代码,您只需为TabBarController.logic 分配一个函数,该函数将TabBarController.Inputs 作为输入参数并返回TabBarController.Outputs。您可以在 AppDelegate 中进行此分配。

在这段代码中要注意的关键是每个 ViewController 子类中都有一个struct Inputs、一个struct Outputs 和一个var logic

Inputs 具有用户可以输入的所有 UI 元素(例如,按钮和文本字段),Outputs 具有用户可以看到的所有 UI 元素(例如,标签文本、isHidden 标志。 )

logic var 是一个包含该视图控制器的所有逻辑的闭包。请注意,它可以分配给。这意味着您可以独立于视图控制器开发和测试逻辑,并且可以根据上下文在必要时为视图控制器提供不同的逻辑对象。

对于使用协调器而不是在容器视图控制器中嵌入代码的更复杂的示例代码,请参阅此 repo:https://github.com/danielt1263/RxEarthquake

class TabBarController: UITabBarController 
    struct Inputs 
        let login: Observable<Void>
    
    struct Outputs 
        let transactions: Observable<[Transaction]>
    

    var logic: (Inputs) -> Outputs =  _ in fatalError("Forgot to set logic.") 
    private let bag = DisposeBag()

    override func viewDidLoad() 
        super.viewDidLoad()

        let settings = children[0] as! SettingsViewController
        let transactionList = children[1] as! TransactionListViewController
        let login = PublishSubject<Void>()
        let outputs = logic(Inputs(login: login.asObservable()))
        let bag = self.bag
        settings.logic =  inputs in
            inputs.login
                .bind(to: login)
                .disposed(by: bag)
            return SettingsViewController.Outputs()
        

        transactionList.logic =  inputs in
            return TransactionListViewController.Outputs(transactions: outputs.transactions)
        
    


class SettingsViewController: UIViewController 
    struct Inputs 
        let login: Observable<Void>
    
    struct Outputs 
    

    var logic: (Inputs) -> Outputs =  _ in fatalError("Forgot to set logic.") 
    private let bag = DisposeBag()

    @IBOutlet weak var login: UIButton!


    override func viewDidLoad() 
        super.viewDidLoad()

        _ = logic(Inputs(login: login.rx.tap.asObservable()))
    


class TransactionListViewController: UIViewController 
    struct Inputs 
    
    struct Outputs 
        let transactions: Observable<[Transaction]>
    

    var logic: (Inputs) -> Outputs =  _ in fatalError("Forgot to set logic.") 
    private let bag = DisposeBag()

    @IBOutlet weak var transactionTableView: UITableView!

    override func viewDidLoad() 
        super.viewDidLoad()

        let output = logic(Inputs())

        let dataSource = MyDataSource()
        output.transactions
            .bind(to: transactionTableView.rx.items(dataSource: dataSource))
            .disposed(by: bag)
    

【讨论】:

以上是关于RxSwift 观察模型的变化并提出请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxSwift 观察 UITextField 中的文本变化?

未调用 RxSwift 订阅块

RxSwift - 可观察的自定义类

RxSwift 仅在添加新元素时观察数组变化

在 RxCocoa/RxSwift 中,如何观察 BehaviorRelay<[object]> 数组大小发生变化

RxSwift 以及如何制作简单的 TableViewController?