2016-11-27 28 views
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())为什么CONCAT从来没有()在rxswift

回答

1

我做的这一点我自己感觉,所以把它当作一粒盐:)

  • Observable.just发射值一次并立即完成;几乎没有时间;
  • .throttle(0.4, scheduler: MainScheduler.instance)引入时间为顺序,以0.4秒+确定返回值,
  • concat(Observable.never())使得输入序列长时间运行,所以throttle有东西摆在首位的事情。

现在return Observable.just(signupResult)就足以实现该功能。剩下的好处是什么?

其他三个运营商导致延迟。由于连接的Observable永无止境,因此throttle将至少等待0.4秒,以确定为第一个受限制的“块”发出哪个值。 take(1)即可完成,一旦第一个值后0.4秒

对我发出的序列,这似乎是实现了延迟的响应:)

0

这仅仅是例子。 FUI,never创建一个可观察不排放项目和未终止(从描述official documentation

+0

谢谢,我知道'never'的用法,所以我不明白为什么使用never(),所以这只是个例子〜 –

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 
相关问题