选择器可观察 - RxSwift
问题描述:
我试图从ReactiveCocoa 2.5到RxSwift我有一个误解。在ReactiveCocoa中,当我想要观察方法的调用时,我使用rac_signalForSelector
。有什么办法可以用RxSwift来实现这个逻辑吗?选择器可观察 - 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() {
}
答
可以使用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)
}
}
}
输出:
下一个([])
完成
+0
感谢您的回答!但是,你能解释一下我上面添加的例子有什么问题吗?我将非常感激! –
答
你应该使用dynamic
修改为访问test
功能从不内联或由编译器devirtualized test
功能。
这样的: dynamic func test() {}
答
我的遭遇后,加入此评论同样的问题,但现在我已经解决了它。
对于我的解决方案 - 如果这不是您搜索的东西,但希望能帮助其他人解决相同问题 - 我很抱歉,只是为观察功能添加了dynamic
修饰符。
这是代码
func viewDidLoad() {
rx.sentMessage(#selector(ViewController.test))
.debug("Test", trimOutput: true)
.subcribe()
.disposed(by: bag)
}
@objc dynamic test() {}
没有dynamic
修改调用测试,因为调试不打印任何不遵守。
我是RxSwift的新手。
感谢@zhongwuzw上面,我读了他的评论后得到了主意。
这可能是因为'self'不是'NSObject'。如果可以提供帮助,我不会推荐使用'sentMessage'。就像你看到的那样,它可以表现得很奇怪,充其量也是代码味道。只在必要时使用它。 – solidcell
@solidcell感谢设置我的理解更多一点! –