【问题标题】:RxSwift subscribe will work when initiatedRxSwift 订阅将在启动时起作用
【发布时间】:2019-04-02 08:01:40
【问题描述】:

我是第一次使用 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)
     }
}

【问题讨论】:

  • 将 BehaviorSubject 更改为 PublishSubject
  • nextPage 在这个类之外在哪里以及如何使用?
  • @MattiaC。当到达表格视图底部时调用 nextPage.onNext(())

标签: ios swift rx-swift


【解决方案1】:

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

请注意,我将 pageNo 保留为 BehaviorRelay,因为这个 observable 有一个初始值是有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多