2016-11-27 6 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)は、その機能を実装するのに十分です。残りは何のために良いですか?

他の3つの演算子は遅延を引き起こします。連結Observableは決して終わりがないので、throttleは、最初のスロットルされた "チャンク"に対してどの値を放出するかを決定するために少なくとも0.4秒待つ。最初の値は、私には0.4秒

後に放出された後take(1)が、その後のシーケンスを完了し、これは応答遅れを実装するために非常に手間のかかる方法であると思わ:)

0

に必要とする理由私は理解できませんでした。 FUI、neverはアイテムを発しないと(official documentationからの説明)を終了しないという観測を作成

+0

ありがとう、私は '決して'の使用法を知っているので、なぜ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 
関連する問題