简体   繁体   English

RxSwift订阅启动后将起作用

[英]RxSwift subscribe will work when initiated

I am using RxSwift for the first time. 我是第一次使用RxSwift。 It will load Post List from my server. 它将从我的服务器加载帖子列表。 The first time only need to run loadPostList but Just by initializing the model, nextPage is called. 第一次只需要运行loadPostList,但是只需初始化模型,即可调用nextPage。

Please let me know what I'm doing wrong. 请让我知道我在做什么错。

class PostNetworkModel {
    var nextPage:BehaviorSubject<Void> = BehaviorSubject(value: ())
    var reFresh:BehaviorSubject<Void> = BehaviorSubject(value: ())
    var raiseError:BehaviorSubject<Void> = BehaviorSubject(value: ())
    var isLoadingComplete = false
    private var pageNo = BehaviorRelay(value: 1)
    var postList : BehaviorRelay<[Post]> = BehaviorRelay(value: [])
    let disposeBag = DisposeBag()
    init() {
        loadPostList()
            .bind(to: postList)
            .disposed(by: disposeBag)

        postList
            .asObservable()
            .subscribe({ ( _) in
                self.isLoadingComplete = true
            })
            .disposed(by: disposeBag)

        nextPage
            .asObservable()
            .subscribe(onNext: { [weak self] ( _) in
                print("nextPage")
                if (self?.isLoadingComplete)!{
                    self?.isLoadingComplete = false
                    self?.pageNo.accept(self!.pageNo.value + 1)
                }
            })
            .disposed(by: disposeBag)
     }
}

BehaviorSubject accepts an initial value as constructor parameter because its specification is as follows: BehaviorSubject接受一个初始值作为构造函数参数,因为其规格如下:

Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications. 观察者可以订阅主题以接收最后(或初始)值以及所有后续通知。

Meaning nextPage will trigger a next even on subscription. 这意味着nextPage甚至会在订阅时触发下一个。 You'll probably want to change all the BehaviorSuject to PublishSubject for this class 您可能需要将PublishSubject所有BehaviorSuject更改为PublishSubject

class PostNetworkModel {
    var nextPage:PublishSubject<Void> = PublishSubject()
    var reFresh:PublishSubject<Void> = PublishSubject()
    var raiseError:PublishSubject<Void> = PublishSubject()
    var isLoadingComplete = false
    private var pageNo = BehaviorRelay(value: 1)
    var postList : PublishRelay<[Post]> = PublishRelay()

    let disposeBag = DisposeBag()
    init() {
        loadPostList()
            .bind(to: postList)
            .disposed(by: disposeBag)

        postList
            .asObservable()
            .subscribe({ ( _) in
                self.isLoadingComplete = true
            })
            .disposed(by: disposeBag)

        nextPage
            .asObservable()
            .subscribe(onNext: { [weak self] ( _) in
                print("nextPage")
                if (self?.isLoadingComplete)!{
                    self?.isLoadingComplete = false
                    self?.pageNo.accept(self!.pageNo.value + 1)
                }
            })
            .disposed(by: disposeBag)
     }
}

Note than I kept pageNo as a BehaviorRelay , as it makes sense for this observable to have an initial value. 请注意,我将pageNo保留为BehaviorRelay ,因为对于这个可观察到的具有初始值是有意义的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM