gpt4 book ai didi

swift - RxSwift,如何更温和地使用 NotificationCenter?

转载 作者:行者123 更新时间:2023-12-05 00:58:04 29 4
gpt4 key购买 nike

收到 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())

因为

Instance method 'concat' requires the types 'Notification' and 'String' be equivalent

所以我添加了一个样板 map

还有更合适的运算符或自定义运算符吗?

最佳答案

提供 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)

如果你没有把所有的函数都放在类中,你可以摆脱 self. 而不必担心捕获 self。

关于swift - RxSwift,如何更温和地使用 NotificationCenter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58703792/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com