Search code examples
iosswiftrx-swiftreactivexrx-cocoa

Observable for selector - RxSwift


I'm trying to migrate my FRP understanding from ReactiveCocoa 2.5 to RxSwift and I have one misunderstanding. In ReactiveCocoa, I used rac_signalForSelector when I wanted to observe an invocation of a method. Is there any way to implement this logic using RxSwift?

I wrote a small example in which I want to dispose a subscription when the test method invokes. But in the subscribe block I can still see a next(6) event. What am I doing wrong?

let subject = PublishSubject<Int>()
subject.takeUntil(self.rx.sentMessage(#selector(test))).subscribe { event in
    print(event)
}

subject.onNext(3)
test()
subject.onNext(6)

//////////////////

func test() {

}

Solution

  • You can use sentMessage:

    class ViewController: UIViewController {
    
        let disposeBag = DisposeBag()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.rx.sentMessage(#selector(UIViewController.viewWillAppear(_:)))
                .subscribe({ e in
                    print(e)
                })
                .addDisposableTo(disposeBag)
        }
    }
    

    Outputs:

    next([0])

    Or another example:

    class SomeNSObjectClass: NSObject {
    }
    
    class ViewController: UIViewController {
    
        let disposeBag = DisposeBag()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let myObj = SomeNSObjectClass()
            myObjc.rx.sentMessage(NSSelectorFromString("dealloc"))
                .subscribe({ e in
                    print(e)
                })
                .addDisposableTo(disposeBag)
            }
        }
    }
    

    Outputs:

    next([])
    completed