2
func signup(_ username: String, password: String) -> Observable<Bool> {
    // this is also just a mock
    let signupResult = arc4random() % 5 == 0 ? false : true
    return Observable.just(signupResult)
        .concat(Observable.never())
        .throttle(0.4, scheduler: MainScheduler.instance)
        .take(1)
 }

我在RxSwift中看到了一些代码,但我不明白为什么需要concat(Observable.never())

4

3 回答 3

1

我自己也在理解这一点,所以请持保留态度:)

  • Observable.just发出一次值并立即完成;几乎不需要任何时间;
  • .throttle(0.4, scheduler: MainScheduler.instance)在序列中引入时间,用 0.4s+ 来确定要返回的值,并且
  • concat(Observable.never())使输入序列长时间运行,因此throttle首先要做一些事情。

现在return Observable.just(signupResult)足以实现该功能。剩下的有什么用?

其他三个运算符导致延迟。由于串联的 Observable 是永无止境的,throttle将至少等待 0.4 秒一次以确定为第一个节流“块”发出哪个值。take(1)然后在 0.4 秒后发出第一个值后完成序列

对我来说,这似乎是实现延迟响应的一种非常费力的方式:)

于 2016-11-28T08:11:02.103 回答
0

@ctietze 的答案似乎是正确的。但是在进行测试之后,我意识到这会throttle扼杀整个概念。基本上throttle会在可观察开始后立即返回值。这意味着它不会等到0.4s发出第一个值。

func testWithThrottle() -> Observable<Int> {
        return
            Observable.just(7) // 1
                .concat(Observable.never()) // 2
                .throttle(3.0, scheduler: Schedulers.background) // 3
                .take(1) // 4

        // 1. -7--|->
        // 2. -7------------------------------->
        // 3. -7------------------------------->
        // 4. -7--|->
}

...

print("[\(Date())] Start!")
testWithThrottle().subscribe({ (event) in
    print("[\(Date())] event: \(event)")
}).addDisposableTo(disposeBag)
print("[\(Date())] End!")

...

[2017-06-03 03:14:00 +0000] Start!
[2017-06-03 03:14:00 +0000] event: next(7)
[2017-06-03 03:14:00 +0000] event: completed
[2017-06-03 03:14:00 +0000] End!

那么,解决方案是什么?很简单,你需要debounce改用。

func testWithDebounce() -> Observable<String> {
        return
            Observable.of("A") // 1
                .concat(Observable.never()) // 2
                .debounce(3.0, scheduler: Schedulers.background) // 3
                .take(1) // 4

        // 1. -A-|->
        // 2. -A------------------------------>
        // 3. ---------------A---------------->
        // 4. ---------------A-|->
}

...

[2017-06-03 03:24:21 +0000] Start Thrrotle!
[2017-06-03 03:24:21 +0000] Finish Thrrotle!
[2017-06-03 03:24:24 +0000] event: next(A)
[2017-06-03 03:24:24 +0000] event: completed
于 2017-06-03T03:27:58.307 回答
0

这只是一个例子。FUI,never创建一个不发射任何项目且不终止的 Observable(来自官方文档的描述)

于 2016-11-27T14:46:36.597 回答