ios - 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)
}
}
解决方案
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 具有初始值是有意义的。
推荐阅读
- arrays - 在VBA中的动态范围数组上使用排序函数?
- elasticsearch - 设置 scaling_factor 参数时的奇怪行为
- javascript - 如何根据机器人中 QnAMaker 的提示显示多个按钮
- html - 我的第一个基于 HostGator 的网站没有连接 html 和 css
- javascript - 输入 '() => 承诺
>' 不能用作索引类型 [ReactJs] - git - 如何将现有 repo 的通信协议从 https for gitlab 更改为 ssh?
- python - 如何在 Python 3.8 上安装 PyQt5-tools(我只能看到最高 3.7 的版本)
- google-apps-script - 谷歌表格!试图从不同的工作表中找出链接、比较和返回信息
- python-3.x - 如何为多个输入设置范围和限制?
- drupal - Drupal 8 主题包括一个我无法通过块布局删除的基本页面