首页 文章

选择器可观察 - RxSwift

提问于
浏览
2

我正在尝试将我的FRP理解从 ReactiveCocoa 2.5 迁移到 RxSwift ,我有一个误解 . 在ReactiveCocoa中,当我想观察方法的调用时,我使用了 rac_signalForSelector . 有没有办法使用RxSwift实现这个逻辑?

我写了一个小例子,我想在 test 方法调用时处理订阅 . 但是在订阅块中我仍然可以看到 next(6) 事件 . 我究竟做错了什么?

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() {

}

3 回答

  • 4

    您应该对 test 函数使用 dynamic 修饰符,以便编译器永远不会内联或舍入对 test 函数的访问 .

    像这样: dynamic func test() {}

  • 2

    我在遇到同样的问题后添加了这条评论,但现在我已经解决了 .

    解决方案对我来说, - 很抱歉,如果这不是你搜索的东西,但希望会帮助其他人解决同样的问题 - 只是为观察到的函数添加了 dynamic 修饰符 .

    这是代码

    func viewDidLoad() {
        rx.sentMessage(#selector(ViewController.test))
            .debug("Test", trimOutput: true)
            .subcribe()
            .disposed(by: bag)
    }
    
    @objc dynamic test() {}
    

    没有 dynamic 修饰符,对test的调用不会打印任何东西 .

    我是RxSwift的新手 .

    谢谢@zhongwuzw,我在阅读他的评论后得到了这个想法 .

  • 2

    你可以使用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)
        }
    }
    

    输出:

    下一步([0])

    或者另一个例子:

    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)
            }
        }
    }
    

    输出:

    next([])完成

相关问题