मैं Viper w/ RxSwift सीख रहा हूं।

मैं अपने Presenter को सूचित करना चाहता हूं कि viewDidLoad को मेरे ViewController में बुलाया गया था।

ऐसा करने के लिए मेरे पास निम्नलिखित हैं:

class LoginPresenter {

    weak var view: LoginView?
    var interactor: LoginUseCase?
    var router: LoginRouter?

    private(set) var viewDidLoad = PublishSubject<Void>()

    private lazy var disposeBag = DisposeBag()

    required init(view: LoginView?, interactor: LoginUseCase?, router: LoginRouter?) {
        self.view = view
        self.interactor = interactor
        self.router = router

        viewDidLoad
            .subscribe(onNext: { _ in
                // do something on viewDidLoad
            }).disposed(by: disposeBag)
    }
}
class LoginViewController: UIViewController {

    var presenter: LoginPresenter?

    override func viewDidLoad() {
        super.viewDidLoad()

        presenter?.viewDidLoad.onNext(())
    }
}

एक बार मेरा व्यू लोड हो जाने पर मैं presenter?.viewDidLoad.onNext(()) को कॉल कर रहा हूं

फिर मैं अपने प्रस्तुतकर्ता के भीतर किसी भी क्रिया को ट्रिगर करने में सक्षम हूं, जैसे कि नेविगेशन कॉन्फ़िगर किया गया है या मेरे interactor को सुनिश्चित करने के लिए मेरे router पर कॉल करना।

क्या मुझे इसके लिए PublishSubject का उपयोग करना चाहिए? या क्या RxSwift के पास बेहतर अनुकूल प्रकार है?

मुझे ऐसा लगता है कि इस दृष्टिकोण का अर्थ है कि मैं कुछ इस तरह से समाप्त करूंगा

        viewDidLoad
            .subscribe(onNext: { _ in
                self.router?.viewDidLoad.onNext(())
            }).disposed(by: disposeBag)
4
Tim J 11 सितंबर 2019, 19:47

1 उत्तर

सबसे बढ़िया उत्तर

हम्म... एक प्रस्तुतकर्ता का काम उपयोगकर्ता की कार्रवाइयों को इकट्ठा करना है और मुझे यकीन नहीं है कि हमें viewDidLoad को एक उपयोगकर्ता कार्रवाई पर विचार करना चाहिए। और किसी भी मामले में, वायरफ्रेम (जो रूटिंग को संभालता है) को यह जानने की आवश्यकता नहीं होनी चाहिए कि पहली बार viewDidLoad कब कहा जाता है; इसका काम नई स्क्रीन प्रस्तुत करना है और आप viewDidLoad में स्क्रीन प्रस्तुत नहीं कर सकते।

उस ने कहा, आप अपने कनेक्शन को ViewController के प्रस्तुतकर्ता में सेट कर सकते हैं:

final class ViewController: UIViewController {

    var presenter: Presenter? {
        didSet {
            guard let presenter = presenter else { viewDidLoadDisposable.dispose(); return }
            viewDidLoadDisposable.disposable = rx.methodInvoked(#selector(viewDidLoad))
                .map { _ in }
                .bind(to: presenter.viewDidLoad)
        }
    }

    let viewDidLoadDisposable = SerialDisposable()

    deinit {
        viewDidLoadDisposable.dispose()
    }
}

final class Presenter {
    let viewDidLoad = PublishSubject<Void>()
}

सामान्य तौर पर, यह viewDidLoad में होता है जहां प्रस्तुतकर्ता और दृश्य नियंत्रक तत्व सामान्य रूप से एक साथ बंधे होते हैं, इसलिए उपरोक्त कोड में एक बहुत ही अप्राकृतिक अनुभव होता है।

साथ ही, वेधशालाएं, विषय और डिस्पोज़बैग vars नहीं होने चाहिए, इसके बजाय lets का उपयोग करें। यह कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग का "कार्यात्मक" हिस्सा है।

2
Daniel T. 26 अप्रैल 2021, 11:24