2016-09-26 83 views
2

我试图从ReactiveCocoa 2.5RxSwift我有一个误解。在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() { 

} 
+0

这可能是因为'self'不是'NSObject'。如果可以提供帮助,我不会推荐使用'sentMessage'。就像你看到的那样,它可以表现得很奇怪,充其量也是代码味道。只在必要时使用它。 – solidcell

+0

@solidcell感谢设置我的理解更多一点! –

回答

3

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

感谢您的回答!但是,你能解释一下我上面添加的例子有什么问题吗?我将非常感激! –

2

你应该使用dynamic修改为访问test功能从不内联或由编译器devirtualized test功能。

这样的: dynamic func test() {}

1

我的遭遇后,加入此评论同样的问题,但现在我已经解决了它。

对于我的解决方案 - 如果这不是您搜索的东西,但希望能帮助其他人解决相同问题 - 我很抱歉,只是为观察功能添加了dynamic修饰符。

这是代码

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

@objc dynamic test() {} 

没有dynamic修改调用测试,因为调试不打印任何不遵守。

我是RxSwift的新手。

感谢@zhongwuzw上面,我读了他的评论后得到了主意。