问题 在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()上发出事件并触发。我也希望这种行为,但在程序上,而不是从UI事件。


9339
2018-03-16 17:44


起源



答案:


大多数情况下,你可以编写你的observable,我即将给出的解决方案不是推荐的Rx代码。

你可以看看 学科 实现您请求的行为。主题有多种变体,文档解释得很好。

一个示例用法,灵感来自RxSwift 操场

let subject = PublishSubject<String>()

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

这将打印出来 "a" 然后 "b"

关于何时使用主题的更多细节,我建议阅读 本文


14
2018-03-16 18:30



嗨@tomahh,您的解决方案有效。但是,你之所以提到“不推荐的方式”是什么原因?比较它时怎么样? AnyObserver<Void>。用 AnyObserver<>,我们可以使用它: var beginLoad: AnyObserver<Void>?  beginLoad = AnyObserver<Void>(eventHandler: { (event) -> Void in print("1234543") })  beginLoad.on(.Next()) - dummy307
还有那个 PublishSubject<String>() 不是一个 Observable,所以我们不能在它上面使用运算符(flatten,concat ....)。 - dummy307
你可以打电话 asObservable() 在这个主题上得到它作为一个 Observable。 - tomahh
主题通常用于包装命令式API。你通常会对现有的observable进行构图(rx_tap就是一个很好的例子)。我建议阅读 本文虽然不是很快,但在解释何时使用主题方面还有很长的路要走。 - tomahh
是的,我看到了如何主题发出事件的方式。非常感谢@tomahh。剩下的就是学会选择正确使用的主题类型:)。 - dummy307


答案:


大多数情况下,你可以编写你的observable,我即将给出的解决方案不是推荐的Rx代码。

你可以看看 学科 实现您请求的行为。主题有多种变体,文档解释得很好。

一个示例用法,灵感来自RxSwift 操场

let subject = PublishSubject<String>()

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

这将打印出来 "a" 然后 "b"

关于何时使用主题的更多细节,我建议阅读 本文


14
2018-03-16 18:30



嗨@tomahh,您的解决方案有效。但是,你之所以提到“不推荐的方式”是什么原因?比较它时怎么样? AnyObserver<Void>。用 AnyObserver<>,我们可以使用它: var beginLoad: AnyObserver<Void>?  beginLoad = AnyObserver<Void>(eventHandler: { (event) -> Void in print("1234543") })  beginLoad.on(.Next()) - dummy307
还有那个 PublishSubject<String>() 不是一个 Observable,所以我们不能在它上面使用运算符(flatten,concat ....)。 - dummy307
你可以打电话 asObservable() 在这个主题上得到它作为一个 Observable。 - tomahh
主题通常用于包装命令式API。你通常会对现有的observable进行构图(rx_tap就是一个很好的例子)。我建议阅读 本文虽然不是很快,但在解释何时使用主题方面还有很长的路要走。 - tomahh
是的,我看到了如何主题发出事件的方式。非常感谢@tomahh。剩下的就是学会选择正确使用的主题类型:)。 - dummy307


对于司机,你可以做到

var isSearching: Driver<Bool>

isSearching = Driver.just(true)

0
2018-01-04 20:41