Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RxSwift, how to use NotificationCenter more gently?

Tags:

swift

rx-swift

Got a IAP purchased notification, then I request the transaction from my server.

To download a song and play , if transaction OK.

I use RxSwift, The following code works, I want to improve it.

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> { // ...  }

I can not use like this

NotificationCenter.default.rx.notification( .purchase )
                   .takeUntil(self.rx.deallocated)
            .concat(self.transactionRequest())

because

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

So I add a boilerplate map

Any more proper operator, or custom operator?

like image 377
black_pearl Avatar asked Dec 09 '25 13:12

black_pearl


1 Answers

The return type of the Observable that is feeding concat and the one that is passed to concat must be the same. I suggest you use flatMap instead. Also, you are capturing self all over the place which means memory issues.

Here's how I would do it:

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)

If you didn't put all your functions inside the class, you could get rid of the self. and not have to worry about capturing self.

like image 76
Daniel T. Avatar answered Dec 12 '25 08:12

Daniel T.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!