RxSwift のドキュメントを読む
RxSwift のドキュメントを読む
RxSwift のリポジトリを眺めてたら丁寧に解説されてるっぽい Playground 発見。
RxSwift/Rx.playground at master · ReactiveX/RxSwift
「あ、こんなのあるのね」(知らんかった
なので読んでみた。
Playground によるインタラクティブなドキュメント、素晴らしい。
Setup
RxSwift/Contents.swift at master · ReactiveX/RxSwift
てな感じで、本 Playground の使い方も丁寧に書いてある。
- とりあえず RxSwift のリポジトリを clone
- RxSwift/Rx.xcworkspace を Xcode で開く
- Scheme から RxSwift-macOS を選択して
Command + b
- Xcode の
Command + 1
で Project navigator から Rx を開く Command + Shift + y
で Debug Area を開く
これで準備完了
以下、読みながらメモしていく。
紹介
なぜ RxSwift を使うのか
- イベントドリブンなコードを簡潔に書く
- 以下のような処理を一貫して行うシステムが Rx
@IBAction
ハンドラの記述- キーボードの位置変化を検出する監視
- URLセッションの完了時の処理をクロージャーで渡す
- キー値監視
- RxSwiftは Reactive Extensions の公式実装
コンセプト
- Observableの各インスタンスは単なるシーケンス
Observable
シーケンス の、SwiftSequence
に対する主な利点は、要素を非同期的に受け取ることができること- これがRxSwiftの本質
- 他のすべてはこの延長
- Observable(ObservableType)はSequenceと同等
- ObservableType.subscribe(_ :)メソッドはSequence.makeIterator()と同等
- ObservableType.subscribe(_ :)は、observer(ObserverType)パラメータをとる
- このパラメータは、Observableによって送出されたシーケンスイベントと要素を自動的に受け取るために登録される
- 返されたジェネレータでnext()を手動で呼び出す必要がない
- このパラメータは、Observableによって送出されたシーケンスイベントと要素を自動的に受け取るために登録される
- Observableが next event(Event.next(Element)) を発行する場合、Observableはイベントを引き続き発行できる
- Observableがエラーイベント(Event.error(ErrorType)) または完了イベント(Event.completed) を発行すると、Observableシーケンスはサブスクライバに追加イベントを発行できない
- Sequence grammar を使ってこのことを簡潔に表現できる
next* (error | completed)?
- marble diagrams を使ってより視覚的に表現することもできる
--1--2--3--4--5--6--|----> // "|" = Terminates normally --a--b--c--d--e--f--X----> // "X" = Terminates with an error --tap--tap----------tap--> // "|" = Continues indefinitely, such as a sequence of button taps
Observables and observers (aka subscribers)
- Observablesは、サブスクライバが存在しない限り、サブスクリプションクロージャーを実行しない
- 次の例では、Observableのクロージャは実行されない
example("Observable with no subscribers") { _ = Observable<String>.create { observerOfString -> Disposable in print("This will never be printed") observerOfString.on(.next("😬")) observerOfString.on(.completed) return Disposables.create() } }
- 次の例では、subscribe(_ :)が呼び出されたときにクロージャが実行される
example("Observable with subscriber") { _ = Observable<String>.create { observerOfString in print("Observable created") observerOfString.on(.next("😉")) observerOfString.on(.completed) return Disposables.create() } .subscribe { event in print(event) } }
- Observables をどう作成したかについては次章で紹介
- subscribe(_ :) は、サブスクリプションなどの使い捨てリソースを表すDisposableインスタンスを返す
- 通常は DisposeBagインスタンスに追加するなどして適切に処理する
- Disposing の章で詳しく説明する
- 通常は DisposeBagインスタンスに追加するなどして適切に処理する
こんな感じか。
英語も平易だし読みやすい。
その他
Mac リプレースして Git の tab 補完を設定。
$ find / -name git-completion.bash ・ ・ ・ /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash ・ ・ ・
ということで ~/.bash_profile
に以下を追記。
source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
以上。
BottomNavigationを使ってみる
BottomNavigationとは
MaterialDesignのサイトによるとBottomNavigationは以下のような時に使用するように書かれています。
Bottom navigation should be used for:
・Three to five top-level destinations of similar importance (alternative: a persistent navigation drawer accessible from anywhere in the app) ・Destinations requiring direct access from anywhere in the app (alternative: tabs for only one or two destinations)
最近のアップデートでYouTubeアプリがNavigationDrawer+tabからBottomNavigationに変更されています。
では、具体的な実装についてみていきましょう。
App shortcutsを使ってみる
App Shortcutとは
ランチャーアイコンを長押しすることで、ショートカットメニューを表示します。 また、ショートカットを長押ししてアイコン(Pined shortcut)としてランチャー上に配置できます。 この機能はAndroid 7.1(API level 25)以上から使用できます。
続きを読むAndroid Oの通知チャンネルを使ってみる
Android Oの通知チャンネルを使ってみる
通知チャンネルとは
続きを読むAndroid O では、ユーザーが通知を管理できるように、統合されたシステムを提供する通知チャンネルが導入されています。Android O を対象とする場合、通知をユーザーに表示するために、1 つ以上の通知チャンネルを実装する必要があります。Android O を対象としていない場合、アプリは Android O 端末上で実行されても Android 7.0 での動作と同じように動作します。 Android Oに対応したアプリでは必ず通知チャンネルを実装する必要がある
Swagger Codegen で自動生成したクライアントSDKを使う(iOS編)
Swagger Codegen で自動生成したクライアントSDKを使う(iOS編)
REST API 実装 - techium にて grape-swagger で作成した JSON 定義を元に Swagger UI で Web API 仕様書を作成したが、Swagger の定義ファイルを使ってクライアント(iOS, Android など 色々 ) のソースコードを生成することもできる。
Swagger Codegen _ API Development Tools _ Swagger
自作した Web API に対し、クライアントソースコードを吐き出して実際に通信してみる。(ドキドキ
続きを読む