Edited at

RxSwiftを5分で始めてみる

More than 1 year has passed since last update.


自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。(2017/06/02現在)

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください!


RxSwiftとは

rxswift


Reactive Programming in Swift


ReactiveX/RxSwift

RxSwiftが何なのかみたいな人は多分5分で始めようと思ってないので説明は省きます。

実装していこう。


RxSwift in Swift4

今回の記事は今世の中のQiitaの記事とかがRxSwiftのバージョン自体が昔のものだったり、Swift3のものばかりなのでSwift4でプロジェクトつくるときどうしようかという時に読んでもらえればと思います。


環境

MacOS Sierra(10.12.6)

Swift version4


さてまずはpod installしようかな

RxSwift v4.0.0-beta.1

今回使うのはRxSwift4.0.0のbeta.1を使います。

3.6.1を使うと、ビルドでエラーがでるためSwift4に合わせるためにベータ版を使います。

なのでPodfileはこんな感じになります。


Podfile

# Uncomment the next line to define a global platform for your project

platform :ios, '9.0'

target 'rxswift-textfield-sample' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for rxswift-textfield-sample
pod 'RxSwift', '4.0.0-beta.1'
pod 'RxCocoa', '4.0.0-beta.1'
end


さて今回はUITextFieldUILabelをつなげようと思います。

UITextFieldから受け取った文字列をUILabelに書き込んでいきます。

ViewController.swiftはこんな感じになります。


ViewController.swift

import UIKit

import RxSwift
import RxCocoa

class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var input: UITextField!

let disposeBag = DisposeBag() //unsubscribeに必要なもの

override func viewDidLoad() {
super.viewDidLoad()

self.input.rx.text.orEmpty
.throttle(1.0, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe(onNext: { [unowned self] text in
self.label.text = text
})
.disposed(by: self.disposeBag)

}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

}


まずUITextFieldUILabeloutletで接続します。(ここはコードで書きたい人はご自身で実装してください)

次にrxです。これがRxSwiftから提供されているものになります。

今回は公式のREADMEの通り

rx.text.orEmptyとしてその後にthrottleというオペレーターで1秒ごとに読みに行くようにします。

2017/10/12 追記:

throttleは「指定した時間は処理を行わない」ものです!理解不足でした。

今回は「指定した時間は処理を行わない」ことをしなくて良いのでいらないコードになります。

例として、何らかのAPIにデータを取得しに行くのに入力毎にアクセスしていたらとんでもないことになるなぁとか言う時に使うものだそうです!

その次によんでいるのはdistinctUntilChangedですね。distinctと言うとSQLでもおなじみかと思います。重複を削除するものです!

そしてsubscribeでonNextを取って処理を書いていきます。

今回はUILabelに書き込みたいので書き込み処理を書いて終わりです。

onNext以外にもerrorやcompleteなどありますが、optionalなので実装しなくても大丈夫です。

最後にunsubscribeするためにdisposedをよびます。

これだけで、UITextFieldUILabelが繋がるんですね。最高すぎるんじゃぁないか!?


最後に

今回のソースコードはあげるほどでもないですが一応GitHubにリポジトリを作っています。

RxSwift-TextField-sample

何故、ios初心者なのでなにか間違えているぞ!とかあれば教えていただきたいです!

Twitter @konojunya