Создать событие вручную в RxSwift

Я новичок в RxSwift и нуждаюсь в очень простой помощи.
Предположим, что у меня есть Observable, и подпишитесь на него вот так.

 let source: Observable<Void> = Observable.create { [weak self] observer in

        guard let _ = self else {
            observer.on(.Completed)
            return NopDisposable.instance
        }

        observer.on(.Next())

        return AnonymousDisposable {

        }
    }

А подписаться так:

 source.subscribeNext { () -> Void in

    }

Возникает вопрос: как я могу генерировать событие для subscribeNext вручную каждый раз, когда мне нужно. Это похоже на поведение rx_tap на UIButton.
Я вижу в примере кода что-то вроде этого source = button.rx_tap.asObservale(). После этого каждый раз, когда пользователь нажимает кнопку, будет генерироваться событие и запускаться subscribeNext (). Я также хочу иметь такое поведение, но программно, а не из события пользовательского интерфейса.


person dummy307    schedule 16.03.2016    source источник


Ответы (2)


В большинстве случаев вы можете составить наблюдаемое, и решение, которое я собираюсь дать, не является рекомендуемым способом выполнения кода Rx.

Вы можете просмотреть тему, чтобы реализовать запрашиваемое поведение. Есть несколько вариантов этого предмета, которые хорошо объясняются в документации.

Пример использования, вдохновленный детской площадкой RxSwift:

let subject = PublishSubject<String>()

_ = subject.subscribeNext { content in
    print(content)
}
subject.on(.Next("a"))
subject.on(.Next("b"))

Будет напечатано "a", затем "b".

Для получения более подробной информации о том, когда использовать тему или нет, я бы рекомендовал прочитать эту статью.

person tomahh    schedule 16.03.2016
comment
Привет @tomahh, Ваше решение работает. Однако по какой причине вы упомянули этот способ как «не рекомендуемый»? А как насчет сравнения с AnyObserver<Void>. ‹Br/› С AnyObserver<> мы можем использовать это так: ‹br/› var beginLoad: AnyObserver<Void>? beginLoad = AnyObserver<Void>(eventHandler: { (event) -> Void in print("1234543") }) beginLoad.on(.Next()) - person dummy307; 17.03.2016
comment
Кроме того, PublishSubject<String>() не является Observable, поэтому мы не можем использовать для него операторы (flatten, concat ....). - person dummy307; 17.03.2016
comment
Вы можете позвонить asObservable() по теме, чтобы получить ее как Observable. - person tomahh; 17.03.2016
comment
Субъекты чаще всего используются для обертывания императивных API. Обычно вы составляете уже существующие наблюдаемые (хороший пример - rx_tap). Я бы рекомендовал прочитать эту статью, хотя и не в быстром, это во многом объясняет, когда использовать Subject. - person tomahh; 17.03.2016
comment
Да, я понимаю, как создать событие. Большое спасибо @tomahh. Осталось научиться правильно подбирать предмет для использования :). - person dummy307; 17.03.2016
comment
Для упрощения вы можете вызвать метод так: subject.onNext("b") - person Seeler99; 20.07.2017

Для водителя вы можете сделать

var isSearching: Driver<Bool>

isSearching = Driver.just(true)
person Maria    schedule 04.01.2017