web-dev-qa-db-ja.com

RxSwiftを使用してSwift 3の配列を観察します

RxSwift in Swift 2)を使用して観測可能な配列を作成するには、次のようにします。

[1, 2, 3].toObservable().subscribeNext { print($0) }

しかし、Swift 3では、それはもう機能しません、私はこのエラーを受け取りました:

タイプ[[Int] 'の値にメンバー' toObservable 'がありません

Swift配列からRxSwift監視可能配列を作成するにはどうすればよいですか?

8
pableiros

Swift 3を使用してRxSwift 3.0を使用して、これを次のように行います。

var array: Variable<[Int]> = Variable([1, 2, 3])
array.asObservable().subscribe(onNext: {
        updatedArray in
        print(updatedArray)
})
array.value.append(4) // it will trigger `onNext` event 

主な違いは、明示的な配列を使用する代わりにVariableオブジェクトを作成する必要があることです。

9
kamwysoc

toObservable array-to-Observableコンストラクターは廃止されました。

コールドオブザーバブルの作成

代わりにfrom演算子を使用して、コールドオブザーバブルを作成します。

let stream : Observable<Int> = Observable.from([1,2,3])

または、配列全体をエントリとして必要とする場合は、just演算子を使用してコールドオブザーバブルを作成します。

let singleEmissionStream : Observable<[Int]> = Observable.just([1,2,3])

fromまたはjust演算子が呼び出された時点での配列の要素は、onNextイベントでの最終的な排出のセットであり、onCompletedイベントで終了します。配列への変更は、この監視可能なシーケンスの新しいイベントとして認識されません。

つまり、その配列の変更をリッスンする必要がない場合は、justおよびfrom演算子を使用して、オブザーバブルを作成できます。

しかし、配列要素の変更をリッスンする必要がある場合はどうなりますか?

配列[E]の変更を観察するには、k8milの回答で指定されているように、Variable RxSwiftユニットのような hot observable を使用する必要があります。タイプVariable<[E]>のインスタンスがあります。各onNextの放出は配列の現在の状態です。

寒い観測物と暑い観測物の違いは何ですか?

コールドとホットのオブザーバブルの区別は、 RxSwift のドキュメントと reactivex.io で説明されています。以下は、ホットオブザーバブルと比較したコールドオブザーバブルの簡単な説明です。

コールドオブザーバブルはサブスクリプションで実行を開始します。つまり、オブザーバブルシーケンスは、Subscribeが呼び出されたときにのみオブザーバーに値をプッシュし始めます。 [...]これは、サブスクリプションがアクティブになる前でも既に値を生成しているマウス移動イベントや株価表示などのホットなオブザーバブルとは異なります。

fromおよびjust演算子は、コードの実行時に配列の現在の状態を取得します。したがって、サブスクライブされている場合に関係なく、監視可能なシーケンスで発生するエミッションのセットを確定します。そのため、後で配列内の要素セットを変更しても、fromまたはjust演算子を使用してオブザーバブルの作成中に放出として認識される要素セットは変更されません。

15
iwillnot