RxSwift,如何更轻松地使用NotificationCenter?

问题描述 投票:1回答:1

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

还有合适的运算符,还是自定义运算符?

swift rx-swift
1个回答
0
投票

正在馈送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.,而不必担心捕获自身。

© www.soinside.com 2019 - 2024. All rights reserved.