2016-09-26 4 views
2

Я пытаюсь перенести мое FRP понимание от 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() { 

} 
+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 функции, доступ к test функции никогда не встраиваются или devirtualized компилятором.

так: 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 выше, я получил идею после прочтения его комментария.

Смежные вопросы