收到 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> { // ... }
Run Code Online (Sandbox Code Playgroud)
我不能这样使用
NotificationCenter.default.rx.notification( .purchase )
.takeUntil(self.rx.deallocated)
.concat(self.transactionRequest())
Run Code Online (Sandbox Code Playgroud)
因为
实例方法“concat”要求类型“Notification”和“String”相等
所以我添加了一个样板 map
任何更合适的运算符或自定义运算符?
正在馈送的 Observable 的返回类型与concat传递给的 Observable 的返回类型concat必须相同。我建议你改用 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)
Run Code Online (Sandbox Code Playgroud)
如果您没有将所有函数都放在类中,则可以摆脱self.并且不必担心捕获 self.
| 归档时间: |
|
| 查看次数: |
2535 次 |
| 最近记录: |