質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
RxSwift

RxSwiftは、Reactive ExtensionsのSwift向けの実装です。iOS開発に用いられ、リアクティブプログラミングを可能にします。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2787閲覧

RxSwiftを使ってTableViewを描画する

sont

総合スコア35

RxSwift

RxSwiftは、Reactive ExtensionsのSwift向けの実装です。iOS開発に用いられ、リアクティブプログラミングを可能にします。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/02/21 07:15

Swift自体はだいぶ長いこと使っているのですが、今更ながらRxSwiftの勉強をしています。
あるデータ配列に格納されたデータに変化があったら、TableViewの描画に更新をかけるような実装をRxSwiftで行いたいのですが、どのようにすれば良いのかわかりません。

どなたかアドバイスいただけるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RxCocoaにitemsというUITableViewの拡張メソッドが用意されています。データ元となるストリームをbind/subscribeでitemsの返す値に接続してあげればOKです。

swift

1let itemsStream: Observable<[Item]> = ... 2 3itemsStream 4 .bind(to: tableView.rx.items(...)} 5 .disposed(by: disposeBag)

itemsの引数はいくつか種類があるので以下の記事を参考にどうぞ。
https://qiita.com/hironytic/items/71bc729abe73ab9f0879


なお、差分計算を用いたより効率的なTableViewの更新を行いたい場合には、 RxDataSources というライブラリを使うと実現できます。こちらの方がRxを使うことのメリットをより多く得られるので、余裕があれば試してみてください。

投稿2019/02/21 14:43

編集2019/02/22 05:16
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sont

2019/02/22 01:09

コメントありがとうございます! itemsは let になっていますが、例えば、表示するデータ配列(ここでいうitems?)に変化が生じた際に、Rxを使ってTableViewの表示データの更新をキックするにはどのようにするイメージでしょうか? 実は引用先記事は事前にチェックしていたのですが、その部分がピンときておりません。
kakajika

2019/02/22 05:21

変数名が紛らわしいのでストリームの方はitemsStreamとしました。 Observableは値を何度も流すことができる性質を持っていますが、その点は理解されていますか?新しい値が流れれば、それに応じてTableViewの表示も自動的に更新されます。 Observableの扱い方がよく分かっていないようでしたら、いきなりTableViewとの連携に取り組むのではなく、まずはObservableを自由に操作できるように勉強されることをオススメします。
sont

2019/02/27 08:29

コメントありがとうございます。 その後RxSwiftのObservableについて勉強しておりますが、なかなかkakajikaさんのコメントの中身を理解できておりません。 > Observableは値を何度も流すことができる性質を持っています ここの部分ですが、Observableがなんども値を流せるというのは、PublishSubjectを使って、onNextを何度も呼び出すということでしょうか? その場合、上記のソースコードではどのようになるでしょうか?
kakajika

2019/02/27 13:34

そうですね、Subjectを使うのも一つの方法です。ただ、Subjectだらけのコードは複雑になりバグを生みやすいので、なるべくなら使い所は少なく済ませた方がよいでしょう。 まずは公式ドキュメントに従いObservable.createあたりから使い方を覚えていってみてはどうでしょうか? https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#creating-your-own-observable-aka-observable-sequence 一応Subjectのコード例をgistに置いておきます。 https://gist.github.com/kakajika/ac7645880c65ae30540fbf1dc0c2795b
sont

2019/03/01 05:05

ありがとうございます。 すぐに習得できるだろうと思ってたかをくくっていたのですが、思った以上にRxSwiftにつまづいていて困っていたのでサンプルコード非常に参考になります。
kakajika

2019/03/02 06:15

今まで手続き型のプログラミングしか触ってこなかった方だと、感覚を掴むまで時間がかかるかもしれませんね。 関数型プログラミングのように、入力となるストリーム(データソースやUIイベントなど)を組み合わせて出力となるストリームを組み立てるという考え方ができるようになると、Rxもスイスイ書けるようになると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問