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 中的文本变化?