Лучшие практики создания подклассов RxSwift - PullRequest
1 голос
/ 26 мая 2020

У меня есть модель представления, которая используется в двух потоках и дошла до стадии, когда ее действительно нужно разделить на суперкласс и два подкласса. Тем не менее, я запутался как лучший способ go о выполнении некоторого подкласса.

При создании модели представления я передаю все взаимодействия, которые могут происходить из представления, например:

Просмотр

class SomeViewController: UIViewController {

    @IBOutlet private weak var nextButton: UIButton!

    private var presenter: SomeViewModel!

    override func viewDidLoad() {
        super.viewDidLoad()
        presenter.configure(nextButtonTapped: nextButton.rx.tap.asDriver())
    }

}

Затем я могу обрабатывать эти действия в своей модели представления следующим образом:

ViewModel

class SomeViewModel {

    private let normalFlow: Bool
    private let diposeBag = DisposeBag()

    init(normalFlow: Bool) {
        self.normalFlow = normalFlow
    }

    func configure(nextButtonTapped: Driver<Void>) {
        handle(nextButtonTapped: nextButtonTapped)
        // call to any other input handlers here...    
    }

    func handle(nextButtonTapped: Driver<Void>) {
        nextButtonTapped.drive(onNext: { [unowned self] in
            guard self.safetyCheckOnePasses(), safetyCheckTwoPasses() else {
                return
            }
            if normalFlow {
                // do some set of actions
            } else {
                // do another set of actions
            }
        }).disposed(by: disposeBag)
    }

    func safetyCheckOnePasses() -> Bool {
        // perform some sanity check...
        return true
    }

    func safetyCheckTwoPasses() -> Bool {
        // perform another sanity check...
        return true
    }

}

Я запутался насчет лучший способ переопределить handle(nextButtonTapped: Driver<Void>) - это потому, что я все еще хочу, чтобы эти проверки работоспособности выполнялись в начале onNext для каждого подкласса, но я хочу, чтобы после этого тело было другим для разных подклассов. Что было бы лучше всего go об этом без дублирования кода?

1 Ответ

0 голосов
/ 26 мая 2020

Rx является частью функциональной парадигмы, и поэтому создание подклассов не подходит.

Переместите ваши safetyCheckOnePasses() и safetyCheckTwoPasses() функции из класса (или, по крайней мере, сделайте их статичными c. ) Таким образом, их можно будет использовать повторно без необходимости в экземпляре.

...