RxSwift观察模型的更改并提出请求

时间:2019-01-28 12:05:10

标签: swift rx-swift

我正在尝试学习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 个答案:

答案 0 :(得分:0)

可悲的是,您的代码示例难以理解。但是,似乎您在询问如何在通过标签栏视图控制器连接的两个视图控制器之间传输数据。以下是您可以执行此操作的一种方法...

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

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

Inputs具有用户可以输入的所有UI元素(例如Buttons和TextFields),而Outputs具有用户可以看到的所有UI元素(例如Label文本) ,isHidden标志。)

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

有关使用协调器而不是在容器视图控制器中嵌入代码的更复杂的示例代码,请参见以下仓库: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)
    }
}