logo header
logo header
logo header
logo header
  • 2018.12.21
  • 技術ブログ

アプリ開発で使っているor使いたいライブラリの話

※本記事は、INDETAIL Advent Calendar 2018の一環として投稿しています。

アプリ開発で使っているor使いたいライブラリの話

はじめまして、アプリ開発エンジニアのota-sijです。
本記事では、私が使っているor使いたいライブラリや技術を紹介しようかと思います。

Carthage

Xcodeのライブラリ管理ツールのCarthage(カーセッジ、カルタゴ)です。
導入方法や利用方法は以下を参考にどうぞ。
https://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1

ライブラリ管理としてはcocoapodsも有名ですが、Carthageの方がシンプルに利用できるのでこちらを採用しています。ビルド時間が早くなるのが一番のメリットで、特にArchiveの時に実感できました。

ただ、導入時に事前にビルドする必要があるので、そこで時間がとられる可能性があります。現状利用している範囲だと、Realmでかなり時間がかかりますが他はそうでもない印象です。

また、GitHubにビルド済みの.Frameworkがあるとそちらをダウンロードして利用するようになっています。そのため、環境によってはビルド済みのものは利用しないようなオプションをつける必要があります。

例えば、Xcode10以降ではSwift4.2でビルドされている必要があるのですが、RealmのGitHubにはSwift4.1.2でビルドされたものがアップされており、エラーとなってしまいます。

そんな時は、-no-use-binarysのオプションをつけることで、回避できます。

Realm

NoSQLデータベースのRealm(レルム)です。
https://realm.io/docs/swift/latest/

他にもCore DataやFMDBなどもありますが、RealmはSQLなどよりも高速かつパフォーマンス的にも優れておりますし、変更検知など様々機能を搭載しており高性能になっているかと思います。

簡単なサンプルはこんな感じです。

データーベースの中身を見るのに、専用のツールRealm Studioも用意されておりiOS、Android両方で利用できるのも大変良いところです。

ただ、利用には以下のような癖が若干あり学習コストが少しかかります。

  • オブジェクトがスタンドアロンか非スタンドアロンかで扱いが変わる
  • スレッド間でのオブジェクトの移動ができない(非スタンドアロンのみ)

Alamofire

Swiftの通信ライブラリのAlamofire(アラーモファイア)です。
https://github.com/Alamofire/Alamofire

APIなどの呼び出しで、URLSessionを利用して自前で処理を作れますが、圧倒的にAlamofireを利用した方が簡単に作れます。Json形式のAPIなら、Codableを利用するとさらに便利になります。
また、UAやヘッダーの内容なども変更できますし、APIだけではなくダウンロードの処理もできるので通信は全てこれにお任せ状態でいけるのではないでしょうか。

EventBus

AndroidのイベントコールバックライブラリのEventBus(イベントバス)です。
https://github.com/greenrobot/EventBus

Androidの場合、非同期で処理終了のイベントなどを受け取る際は、コールバックインターフェースを実装していると思いますが、コールバックインターフェースが増えると依存関係が複雑化してしまうことあるかと思います。

EventBusを利用すると、イベントを受け取りたいクラスでregister / unregisterをして、イベントを送りたい箇所でpostするだけで利用でき、上記のような依存関係の複雑化を解消できるかと思います。イメージとしては、iOSのNSNotificationCenterの仕組みに近いかと思います。

簡単なサンプルはこちら。

イベントオブジェクトの通知されるメソッドが紐づいた形となっています。
そのため、イベントオブジェクトが増えると可読性が悪くなる可能性があるので、その辺はしっかりと事前に設計する必要があるかと思います。

また、サンプルではEventBus.getDefault()を使用してどこにでも通知可能な状態ですが、EventBusのインスタンスを別途作成して、通知できる範囲を絞ることも可能です。

ここからは、個人的に利用したいと思っているライブラリとなります。

LightWeight-stream

https://github.com/aNNiMON/Lightweight-Stream-API

Java8からStreamやOptionalなどが搭載されていますが、AndroidではminSdkVersionを24以上にした場合だけ利用できます。当分は、StreamやOptionalを利用する場合は、このライブラリを利用することになるかなと思います。

Stream

Streamはコレクションの操作を便利にする、filterやmapを利用できるようになります。

例えば、文字列リストのフィルターして大文字にしたい場合、従来だと

となりますが、Streamを利用すると

となり、ネストもなく見やすいのかなと思います。

他にも色々なメソッドが用意されているので、その辺りを使えば複雑な処理もシンプルに書けそうです。

Optional

Swiftではおなじみですが、同じようなことができるようになります。
従来ではif-nullチェックをするのが一般的でしたが、Opitonalを利用することで記述を簡潔に、また統一的なインターフェースにすることができるようです。

例えば、ActionBarを利用する場合、従来だと

となりますが、Optionalを利用すると

となります。

ifPresentnullじゃない場合の処理ですが、nullの場合の処理としてorElseorElseGetと言ったメソッドも用意されています。

OnActivityResult

https://github.com/vanniktech/OnActivityResult

AndroidのActivityやFragmentで、onActivityResultsを利用する場合、requestCoderesultCodeを元に多数の分岐ができて可読性の悪いソースになるかと思います。

そんな時に、OnActivityResultを利用すると、requestCoderesultCodeのペアでメソッド化できるのでわかりやすくなるのではないでしょうか?

どこでなんの処理が行われるかがわかりやすくなったと思います。

@OnActivityResult以外にも、IntentからExtraの内容を取得できる@ExtraString@ExtraBooleanなども用意されており、その辺りを使うともっとよくなるかもです。

Rx

RxとはReactiveX(Reactive Extensions)のことで、RxSwift RxJavaなど様々なフレームワークに広がっているようです。
https://github.com/ReactiveX/RxSwift

では、ReactiveXとは何かという話ですが、私も詳しくは使ったことがないので以下のようなことができ、処理を簡潔に書けそうだという印象をもっております。

  • ViewとModelのバインディングができ、Modelのvalueが変わるとViewに自動的に反映される
  • Viewのイベントをフックして、処理を記述しやすい

など、私も不勉強の部分が多々あるので、これから勉強していきたいと思っています。

Kotlin

GoogleがAndroidアプリの開発言語に選定した、最近注目されている言語です。
https://developer.android.com/kotlin/?hl=ja

まだ、私は利用したことがありませんが、これからAndroid開発はKotlinメインに移行する気がしますので是非とも利用していきたいです。

言語としての書き方も、非常にSwiftに似ている(Swiftが似ている?)ところが多いので、現在Swiftのみの開発者も初めやすいのかなと思います。

Androidだけではなく、iOS向けの開発も同時にできるのでクロスプラットフォームとしても利用できるのではないかと個人的には期待しています。

最後に

以上が、アプリ開発時に利用している or 個人的にこれから利用していきたいライブラリでした。

利用しているライブラリも、完璧に使えているかと言えば微妙なところです。現在のトレンドや新しい書き方、ライブラリが、次々出てきますので、何がプロジェクトにとって良いのかを考えながら新しいものに触れて行きたいものです。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!