[英]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.