簡體   English   中英

RxSwift,如何更溫和地使用 NotificationCenter?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM