[英]RxSwift, how to use NotificationCenter more gently?
收到 IAP 购买通知,然后我从我的服务器请求交易。
下载歌曲并播放,如果交易OK。
我使用 RxSwift,以下代码有效,我想改进它。
NotificationCenter.default.rx.notification( .purchase )
.takeUntil(self.rx.deallocated)
.map { (noti) -> String in
return "Not care"
// I want to optimize this step
}.concat(self.transactionRequest())
.flatMap{ self.downloadSong($0) }.subscribe(onNext: { downloaded in
if downloaded{
self.playMusic()
}
})
.disposed(by: rx.disposeBag)
func transactionRequest() -> Observable<String> { // ... }
func downloadSong(_ src: String) -> Observable<Bool> { // ... }
我不能这样使用
NotificationCenter.default.rx.notification( .purchase )
.takeUntil(self.rx.deallocated)
.concat(self.transactionRequest())
因为
实例方法 'concat' 要求类型 'Notification' 和 'String' 是等价的
所以我添加了一个样板map
还有更合适的运算符或自定义运算符吗?
提供concat
concat
返回类型必须相同。 我建议您改用 flatMap 。 此外,您正在到处捕捉self
,这意味着 memory 问题。
这是我的做法:
NotificationCenter.default.rx.notification(.purchase)
.flatMapLatest { [unowned self] _ in self.transactionRequest() }
.flatMapLatest { [unowned self] in self.downloadSong($0) }
.subscribe(onNext: { [unowned self] downloaded in
if downloaded {
self.playMusic()
}
})
.disposed(by: rx.disposeBag)
如果你没有把你所有的功能都放在 class 里面,你可以摆脱self.
并且不必担心捕获自我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.