2016-09-26 193 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上面,我讀了他的評論後得到了主意。