kazuki’s blog

新人エンジニアのブログ

RxSwift紹介と基本の使い方

こんにちは、かずきです!

今回の記事で一旦Swiftはおしまいにしようかと思います。
そんでもってReactiveExtension(Rx)の布教記事ですw
プログラミング初心者にはオススメしません...

Reactive Extensionsとは

非同期処理で非常に扱いやすくするライブラリで、
主にIObservableインタフェースとIObserverインタフェースから成り立ちます。
学習コストは高いものの、他の言語のRxライブラリでもほぼ使い方が変わらないため学習効率は良いと思います。
 
Observerから発火される通知をメッセージと言い、メッセージ外部に流すのがObservableとなり、
通知を受け取る側IObservableを実装したクラスをSubscribe(購読)する事になります。
 
Observer -> Observable -> (Operator) -> Subscriberの流れをストリームと言い、
Operatorはメッセージの加工や通知タイミングの変更・フィルタリング、ストリームの合成などを行えます。

Reactive Extensionsで出来る事

非同期

Observerからの通知をトリガーに動作しているので、当然の事ながら非同期を扱う事が出来ます。

時間

何秒後or毎に通知を送るObservable、Timer・Intervalが用意されていたり、
通知を遅らせるDelayや一定時間通知が無かった場合に購読を終了するTimeoutなどのOperatorがあります。

合成

複数のObservableから送られてくるストリームを合成し新しいストリームを作成する事が出来ます。
単純にストリーム合成したストリームを作成したいならMarge
それぞれのObservableから1つづつメッセージが流れ来た時に通知を受け取りるストリームを作成する場合はZipなど...etc
   
 
 
いくつか説明しましたが、他にも色々あるので残りは割愛。
ざっくり言うと通知を受け取って色々と処理を走らせる事がとても便利なライブラリって事ですw
 
スマホアプリなどではユーザの操作があった際に処理をしたいが多々あると思います。
そんな時に常に監視せずに実装できるのがReactive Extensionsって訳です。
(もちろんライブラリ内部では監視してるけど監視タイミングなどが集中管理されているので、個別監で視処理書くよりパフォーマンスが良買ったりする)

RxSwiftとは

Reactive ExtensionのSwift向けライブラリです(RxはC#(.Net)で最初に登場した)以上!

CocoaPodsの導入

RxSwiftをプロジェクトに追加するためには、CocoaPodsを利用します(他の方法もありますがコレが1番楽)

まずmacのLanchPadなどからターミナルを開き次のコマンドを叩きます。

sudo gem install cocoapods

次にCocoaPodsセットアップのコマンドを叩きます。

pod setup

導入は以上!

RxSwiftの導入

まだターミナルからは逃れられません! cdでプロジェクトのディレクトリまで移動して次のコマンドを叩きます。

pod init

Podfileというファイルが出来ているはずなので編集します。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'プロジェクト名' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for ProjectName
  pod 'RxSwift'
end

編集し終わったら、ターミナルでコマンドを叩きます。

pod install

これで導入終了! CocoaPodsでインストールしたライブラリを利用する場合は拡張子が.xcworkspaceのファイルでプロジェクトを開いてください!!

プロジェクトでRxSwiftを利用する

RxSwiftを利用するソースコードの上部で

import RxSwift

と記述する事で利用できます。

ObserverとObservable両方の機能を持つSubject

IObserverインタフェースとIObservableインタフェースの両方を1つクラスで実装しているものをSubjectと言い、
メッセージの発火・購読の両方を1つのクラスで行う事が出来ます。
最初の内はSubjectを利用する事が多くなるかと思います。
SubjectはPublishSubject BehaviourSubject ReplaySubject3種類あります。

PublishSubject

1番単純な機能のSubjectです。 購読を開始してから発火されたメッセージを受け取る事が出来ます。  

var publishSubject = PublishSubject<T>()  // Tはメッセージで送るデータの型

BehaviorSubject

購読開始時に購読直前に発火されたのメッセージの内容を受け取る事が出来ます。
(購読開始時にまだ何も発火されていない状態だった場合は初期値が通知されます)

var behaviorSubject = BehaviorSubject<T>(value: default) // defaultは初期値

ReplaySubject

BehaviorSubjectでは購読開始時に購読直前のメッセージ内容を1つだけ受け取れましたが、 ReplaySubjectでは指定したバッファサイズ分過去のメッセージを受け取る事ができ、 初期値の通知などはありません。

 // ReplaySubjectのみcreateメソッドで作成する
var replaySubject = ReplaySubject<T>.create(bufferSize: size)

RxCocoaとは

UIKitを扱うためのRxSwift向けの拡張ライブラリで、
ボタンのタップや、テキストフィールドへの入力内容の変化をメッセージとして受け取れます。

インストールはRxSwiftと同様CocoaPodsを利用して、インストールします。 Podfileを編集します。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'プロジェクト名' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for ProjectName
  pod 'RxSwift'
  pod 'RxCocoa' # <- これを追加する
end

追加したので、コマンドを叩いてインストールする

pod install

以上で導入完了です!
 
 
Rx初心者にはとってRxCocoaはわかりやすく使いやすいものだと思いますので、
RxSwiftと一緒にRxCocoaも導入する事をオススメします!

まとめ

  • Reactive Extensionは非同期とか時間とか扱える便利なヤツ!
  • RxSwift・RxCocoaはCocoaPodsを使ってインストール
  • RxCocoaはタップなどのUIのイベントを取って処理を書ける  
     
    これでSwiftに関する記事は一旦終了です。
    ありがとうございましたm( )m
     
    次回は備忘録的にUnityとかの記事書こうかなって思ってます!