首页 > 解决方案 > RxSwift 订阅将在启动时起作用

问题描述

我是第一次使用 RxSwift。它将从我的服务器加载帖子列表。第一次只需要运行loadPostList,但只需初始化模型,调用nextPage。

请让我知道我做错了什么。

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)
     }
}

标签: iosswiftrx-swift

解决方案


BehaviorSubject接受一个初始值作为构造函数参数,因为它的规范如下:

观察者可以订阅主题以接收最后(或初始)值和所有后续通知。

意思nextPage是即使订阅也会触发下一个。您可能希望将所有这些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)
     }
}

请注意,我将其保留pageNoBehaviorRelay,因为此 observable 具有初始值是有意义的。


推荐阅读