読者です 読者をやめる 読者になる 読者になる

inFablic

Fablic開発者ブログ

ReSwiftでiOSアプリの状態管理

エンジニアのninjinkunです。先日FablicからリリースされたバイクフリマアプリRIDEのiOS版では、ReduxのSwift実装であるReSwiftを採用しています。このReSwiftについてReactive Swift Meetupで発表したので、資料を公開します。

デモ動画

また、発表で使用したデモ動画を以下にまとめました。スライドの進行に合わせてご覧頂ければと思います。

起動フローのデモ

スライド4ページ目

ウォッチリスト同期のデモ

スライド15ページ目

補足資料

また、この発表はRIDEの開発中に書いた以下のエントリーを背景としています。

アプリ開発と状態遷移の管理 - ninjinkun's diary

4/16 追記 非同期処理について

非同期処理について、当日会場で質問を受けたので追記します。

基本的に非同期処理はReduxの範疇外です。しかし非同期処理をReduxと組み合わせるのはそれほど難しくありません。

RIDEでは以下の様に非同期処理の開始/成功/失敗をActionとして記述しています。ReSwiftにはAsyncActionCreatorという仕組みがあり(redux-thunkに近いもの)このコードでも使用されていますが、余り大したことはしてくれないので使っても使わなくてもどちらでも良いと思います。

extension HomeState {
    static func fetchItemsAsyncAction(maxId: Int?) -> Store<AppState>.AsyncActionCreator {
        return { (state, store, callback) in
            callback { _, _ in RequestItemsAction() }
            RIDE.getClient().getItems(maxId, handler: { result in                            
                switch result {
                case .Success(let response):
                    callback { _, _ in ReceiveItemsAction(rawPayload: response) }
                case .Failure(let error):
                    callback { _, _ in APIErrorAction(rawPayload: error) }
                }
            })
        }
    }
}

また、非同期処理を綺麗に書こうとするならPromise等を導入するのが良いと思いますが、今のところそこまで込み入った非同期処理がないため、ただのコールバックで書いています。

まとめると、非同期処理は素朴にActionとして表現する、コードは普通のコールバックというスタイルで今のところ問題無く運用しています。