gpt4 book ai didi

swift - RxSwift 观察模型的变化并发出请求

转载 作者:行者123 更新时间:2023-11-30 10:51:40 24 4
gpt4 key购买 nike

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

在父选项卡栏 Controller 上,我有一个变量,当 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 上被迷住了几次。

有人可以帮我吗?

最佳答案

遗憾的是,您的代码示例难以理解。但是,您似乎在问如何在通过选项卡栏 View Controller 连接的两个 View Controller 之间传输数据。以下是您可以采取的一种方法...

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

这段代码中需要注意的关键是,每个 ViewController 子类都有一个 struct Inputs、一个 struct Outputs 和一个 varlogic它。

Inputs 包含用户可以输入的所有 UI 元素(例如,按钮和 TextFields),Outputs 包含用户可以输入的所有 UI 元素请参阅(例如,标签文本、isHidden 标志。)

logic var 是一个闭包,其中包含该 View Controller 的所有逻辑。请注意,它可以被分配给。这意味着您可以独立于 View Controller 来开发和测试逻辑,并且如果需要的话,可以根据上下文为 View Controller 提供不同的逻辑对象。

有关使用协调器而不是在容器 View Controller 中嵌入代码的更复杂的示例代码,请参阅此存储库: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)
}
}

关于swift - RxSwift 观察模型的变化并发出请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54401647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com