收到IAP购买的通知,然后我从服务器请求交易。
要下载歌曲并播放,如果交易正常。
我使用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'和“字符串”等价]
所以我添加了样板map
还有合适的运算符,还是自定义运算符?
正在馈送concat
的Observable的返回类型与传递给concat
的Observable的返回类型必须相同。我建议您改用flatMap。另外,您正在到处捕获self
,这意味着内存不足。
这是我的处理方式:
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)
如果您没有将所有函数都放在类中,则可以摆脱self.
,而不必担心捕获自身。