我正在尝试将我的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() {
}
你可以使用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)
}
}
}
输出:
下一个([]) 完成
你应该使用dynamic
修饰符用于test
函数,访问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,我读完他的评论后得到了这个想法。
避免使用sentMessage的另一个解决方案是定义testSubject并在测试函数中触发下一个事件。
let subject = PublishSubject<Int>()
let testSubject = PublishSubject<Void>()
subject.takeUntil(testSubject).subscribe { event in
print(event)
}
subject.onNext(3)
test()
subject.onNext(6)
//////////////////
func test() {
testSubject.onNext(())
}
这只会在调用test()之前打印。