[英]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.