簡體   English   中英

RxSwift觀察模型的更改並提出請求

[英]RxSwift Observe changes on model and Make request

我正在嘗試學習RxSwift概念,不幸地卡在某個地方。 我的TabBarController連接了兩個不同的屏幕。 在我的SettingsViewController ,我得到兩個字符串值並創建一個模型,在TransactionListViewController ,我需要觀察其變化並提出新的請求以填充列表。

在父選項卡欄控制器上,我有一個變量,當didLoadCall時,我使用wallet.asObservable().subscribe訂閱了該模型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上卻迷上了幾次。

有人可以幫我嗎?

可悲的是,您的代碼示例是難以理解的。 但是,似乎您在詢問如何在通過標簽欄視圖控制器連接的兩個視圖控制器之間傳輸數據。 以下是您可以執行此操作的一種方法...

為了使用此代碼,您只需要向TabBarController.logic分配一個函數,該函數將TabBarController.Inputs作為輸入參數並返回TabBarController.Outputs 您可以在AppDelegate中進行此分配。

此代碼中要注意的關鍵是,每個ViewController子類中都有一個struct Inputs ,一個struct Outputs和一個var logic

Inputs具有用戶可以輸入到的所有UI元素(例如Buttons和TextFields),而Outputs具有用戶可以看到的所有UI元素(例如Label text,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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM