为什么在rxswift中concat never()

时间:2016-11-27 13:40:09

标签: ios rx-swift reactive

   $scope.AddToTotal = function() {
      var total = 0;
      for (var i = 0; i < $scope.items.length; i++) {
        if ($scope.items[i].myOperation === 'Add') {
          total += $scope.items[i].myNumber;
        } else if ($scope.items[i].myOperation === 'Divide') {
          total /= $scope.items[i].myNumber;
        } else if ($scope.items[i].myOperation === 'Subtract') {
          total -= $scope.items[i].myNumber;
        } else if ($scope.items[i].myOperation === 'Multiply') {
          total *= $scope.items[i].myNumber;
        }
      }
      return total;
    }

我在RxSwift中看到了一些代码,但我无法理解为什么需要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) }

3 个答案:

答案 0 :(得分:1)

我自己也理解这一点,所以请你带上一粒盐:)

  • .throttle(0.4, scheduler: MainScheduler.instance)发出一次值并立即完成;它几乎没有时间;
  • concat(Observable.never())将时间引入序列,使用0.4s +确定要返回的值,
  • throttle使输入序列长时间运行,因此return Observable.just(signupResult)首先要做的事情。

现在throttle足以实现该功能。剩下的好处是什么?

其他三个运营商导致延迟。由于连接的Observable永无止境,take(1)将等待至少0.4秒一次,以确定为第一个节流的&#34; chunk&#34;发出哪个值。 "analyzer": { "ipv4analyzer": { "tokenizer": "ipv4tokenizer" } }, "tokenizer": { "ipv4tokenizer": { "pattern": "([0-9]{1,3})", "type": "pattern", "group": "1" } } 然后在0.4s

之后发出第一个值后完成序列

对我而言,这似乎是实施延迟回应的一种非常费力的方式:)

答案 1 :(得分:0)

这只是一个例子。 FUI,never创建一个不发出任何项目且不终止的Observable(来自official documentation的描述)

答案 2 :(得分: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