iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

RxSwift

【RxSwift】Observableを再帰的に実行したい

Observableを再帰的に実行するサンプル実装をしたので、軽くメモしておきます もっといい書き方あったらコメントで教えてください! どんな状況? やりたいこととしては、データIDの配列からページネーションしながらIDを取り出し、そのIDを元にデータを取得…

【RxSwift】Error発生時の再度実行

Observableでエラーが発生した時の再度実行に関するメモです retry, retryWhen Observableでエラーが発生した場合、再度subscribeするには主にretry・retryWhenオペレーターが使えます。 retryオペレータはシンプルで、エラーが発生した場合に無条件でObserv…

RxSwiftのMaybeって何だっけ?

Maybeとは? success・error・completedのいずれかのイベントで、最初のイベントのみをキャプチャするObservableです。つまり、何らかのイベントが流れた時点で、Obsrevableはdisposeされます。 Singleと混合しがちですが、Singleではcompletedイベントを送…

【RxSwift】ConnectableObservableってなんだっけ

久しぶりにRxSwiftを触ろうと記事を漁っていたら、ConnectableObservableというObservableが出てきて、これなんだっけ?となったので軽くメモ‍♀️ 結論 ConnectableObservableはHotなObservableです! 完。 となるとちょっと短いので、ちょっと解説すると。 …

【RxSwift】ScrollViewのContentSizeの変更通知を受け取る

結論 下記のようにKVOでcontentSizeを取得することができます。ちなみにこの状態で返る値はObservable<CGSize?>になります。 scrollView.rx.observe(CGSize.self, "contentSize") // Observable<CGSize?> 今回は、heightのみでいいのと、アンラップした状態で値をリッスンした</cgsize?></cgsize?>…

【RxSwift】イベントをenumに変える便利なオペレータがあった

イベントをenumに変える便利なオペレータがあったことを最近知ったので、メモしておきます👷‍♀️ reactivex.io .materialize() .materialize()は、ストリームに流れる各イベントを、それぞれEventというenumに変換します。 @frozen public enum Event<Element> { /// Nex</element>…

【RxSwift】Observableエラーの取り回しをちょっと便利にする

本日はRxSwift CommunityのActionライブラリを使った、便利なObservableエラーの取り回しについて簡単に紹介したいと思います‍♀️ github.com こんな時どうする? Observableで流れてくるErrorを取得したいけど、Errorが流れてきた場合にストリームを中断した…

【RxSwift】ストリームに影響を与えない処理を追加する

下記のようにsubscribe時に必要な処理を全て書いても問題ないですが、Logger.log(text)はイベント処理するための本質的なメソッドではないため、このような状態を許容しているとどんどんコードが見づらくなっていくことが予想できます。 incrementalSearchTe…

【RxSwift】特定のObservableの最新値をストリームに合成したい

結論 あるObservableの最新値をストリームに合成したい場合は.withLatestFrom()オペレーターを使用します。 ob1.withLatestFrom(ob2) .subscribe(onNext: { ob1, ob2 in // TODO: }) .disposed(by: disposeBag) 短いですが、本日も以上になります その他の記…

【RxSwift】一定期間内に発生したイベントの最初のイベントを取得する

結論 下記のようにすることで、observableから流れてくる最初のイベントから500msの間隔があくまで、次のイベントをストリームに流さないようにすることができます。例えば、UIScrollViewなんかで最初のスクロールイベントのみを取得したい場合なんかに有効…

【RxSwift】TextField で .editingChanged の時だけ文字列を取得したい

RxSwift で TextField.text の変更をリッスンしたい時、下記のように書こうとした経験がある人は結構多いかと思います textField.rx.text .subscribe(onNext: { text in print(text) }) .disposed(by: disposeBag) あまり RxSwift に馴染みのない場合、これ…

【Swift】Firebase Storage で JPEG ファイルをアップロードする

今日はタイトルの通り、Firebase Storage で JPEG ファイルを Swift でアップロードする方法を紹介したいと思います‍♀️ 使ったもの 今回の実装をする上で使用したものは下記になります。 Firebase/Storage 6.34.0 RxSwift 6.0.0-rc.1 Xcode12.0.1(Swift5.3) …

【Swift】Realm + RxSwift でデータの更新を通知する

今回は RxSwift で Realm のデータ(Object) の更新を通知する方法を簡単に紹介します‍♀️ それではやっていく データの変更を通知するための Observable を返すメソッドは下記のようになります。Realm Object のインスタンスメソッド observe でデータの変更…

RxSwift の Subject での Error の取り扱いに注意する

PublishSubject に onError() でError を流した場合、次回以降同一の Subject オブジェクトをサブスクライブすると、初回時に Error が流れてくるようです🧑‍🔧 具体的には下記のような感じです。 let relay = PublishSubject<String>.init() let disposeBag = DisposeBa</string>…

RxSwift で簡易インクリメンタルサーチ

個人で開発中のアプリで RxSwift を使用した簡易インクリメンタルサーチを実装したので、その方法を簡単にまとめたいと思います 作業していくっ‍ 今回行うインクリメンタルサーチの仕様は下記の通りで、入力した ID が使用可能かどうかを調べるためにこの機…

RxSwift で特定の数だけイベントを受け取る

Hot な Observable から流れてくるイベントで、特定の回数だけイベントを受け取りたいということはよくあるかと思います。そんな時は .take() を使って回数を絞ることができます。 下記はストリームに流れてきたイベントを Observable が一度受信したら、購…

RxSwift(RxCocoa) における Subject・Relay を理解する

今回は RxSwift(RxCocoa) でたびたび使用する Subject・Relay の違いや Observable との違いについて簡単にまとめようと思います。また、Trait などはまた別の記事で触れようかと思います。 Subject・Relay とは? これらのクラスはイベントの検知もできます…

RxSwift における subscribeOn と observeOn の違い

RxSwift などで処理をつなげて書いていると、ここはメインスレッドで、ここはバックグランドスレッドでなどと、処理によってスレッドを切り替えたい場合があるかと思います。そんな時は、Observable のプロパティとして提供されている subscribeOn または、o…

RxSwift で非同期処理を合成しよう

今回は同じ型の非同期処理を RxSwift でまとめる際に使用する concat と merge の使い方と挙動を簡単にまとめとこうと思います。 concat concat() は複数の非同期処理を渡された順番で順次処理を行っていきます。サンプルは次のようになります。 let ob1 = O…