RxSwift Наблюдать за изменениями в модели и сделать запрос - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь изучить концепцию RxSwift и застрял где-то, к сожалению.К моему TabBarController подключено два разных экрана.На моем SettingsViewController я получаю два строковых значения и создаю модель. На TransactionListViewController мне нужно наблюдать за изменениями и делать новый запрос на заполнение списка.

На родительском контроллере панели вкладок,У меня есть переменная, и когда didLoadCall я подписываюсь на эту модель с wallet.asObservable().subscribe

Вкл. SettingViewController, когда пользователь нажимает кнопку входа в систему, я пытаюсь изменить UserModel с этим кодом:

if let tabBar = parent?.parent as? TransactionTabBarController{
   Observable.just(wallet).bind(to: tabBar.wallet)
}

Я понял, что вызывается функция onNext для wallet.asObservable (). Subscribe.

На моем 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)

Я попытался установить кошелек для функции onNext в TabBar, и я несколько раз запал на TransactionListViewController.

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 29 января 2019

К сожалению, ваш пример кода непостижим.Однако кажется, что вы спрашиваете, как передавать данные между двумя контроллерами представления, которые подключены через контроллер представления панели вкладок.Ниже приведен один из способов сделать это ...

Чтобы использовать этот код, вам нужно только назначить функцию для TabBarController.logic, которая принимает TabBarController.Inputs в качестве входного параметра и возвращаетTabBarController.Outputs.Вы можете сделать это назначение в AppDelegate.

Ключевым моментом в этом коде является то, что каждый подкласс ViewController содержит struct Inputs, struct Outputs и var logic.

Inputs имеет все элементы пользовательского интерфейса, в которые пользователь может ввести (например, кнопки и TextFields), а Outputs имеет все элементы пользовательского интерфейса, которые может видеть пользователь (например, текст метки,isHidden flags.)

Var logic - это замыкание, которое содержит всю логику для этого контроллера представления.Обратите внимание, что это может быть назначено.Это означает, что вы можете разрабатывать и тестировать логику независимо от контроллера представления, и при необходимости вы можете предоставить контроллеру представления другой логический объект в зависимости от контекста.

Для более сложного примера кода, в котором вместо этого используется координаторвстраивания кода в контроллер представления контейнера, см. этот репозиторий: 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)
    }
}
...