3/19 Realm World Tour - The Realm Mobile Platform Experience #realmworld
アジェンダ
- The Realm Mobile Platform Experience
- Product updates
- Realm Objective-C/Swift2.2-2.4
- Realm Java
- Guest presentations
- Ito
- Fumihiko Siroyama
- Introduce Error Prone
- Realm Mobile Platform Demo
- Realm本、Tシャツプレゼント
- 写真撮影、懇親会
連絡先(日本語で質問できる)
The Realm Mobile Platform Experience@Marius Rackwlzさん
- ベルリンからtry!Swiftのスピーカーとして来た
どういった機能を持っていて、どのように活用していくのかについて
長い間βバージョンだった
- 昨年、1.0になった
- メジャーアップしない限りは破壊的な仕様変更はない
- 多くの企業に採用して貰った
あなたのiPhoneにあるアプリの少なくとも1つはRealmを使っている
Realmは既存のDBを使っているのではない
- 特徴的なもの:LiveObject
- データを更新した時に自動的に他も更新されて常に最新の状態に保たれる
- メモリに出来る限りデータをコピーしないようにしている
- これによって高速が保たれている
- 最近のモバイル開発に求められるスムーズなインタラクションの提供やUIの変更をできるだけシンプルにしたいという要求にこたえられるSDKになっている
- ライブオブジェクトを提供するために重要だと考えている部分の部品
- リアクティブなアプリをシンプルに作れる
Object
保存するオブジェクトをどのように作ればいいのか
- クラス定義を作ればオブジェクトを作れる
- CoreDataのように中間生成物を作る必要はない
- 他のクラスと同じようにメソッドを定義したりできる
オブジェクトをRealmに保存して、使う時はクエリを使う
- 得られるオブジェクトはListだったりResultオブジェクトだったりする
- 遅延ロード、メモリにコピーしないということに拘っているのでResultを取るだけだとメモリにはコピーされない
- 1つ1つのオブジェクトのプロパティにアクセスするまではデータを取ってこない
- Resultセットはある時点でのスナップショットで実際のデータは保持されていない
- 再度アクセスした時には最新の状態のデータが取って来れるようになっている
Query
- コードを一見するとdocテーブルのオブジェクトを一気に取得してフィルタリングしているように見えるが、メタデータだけ取得している
- クエリを発行した時点ではデータはメモリ上にコピーされない
- puppiesのプロパティにアクセスした時にコピーされる
Dogオブジェクトが増えた時、再度このクエリを実行する必要はない
オブジェクトを取得してバックグラウンドで追加するのが典型的な例
- Realmに変更があった場合、Notificationを使ってUIを更新しなければいけないということを知ることができる
Notification
- 先程のクエリの結果に対してaddNotificationBlock、もしくはaddChangeListenerで登録する
- 変更がある度に呼ばれる
- 件数が増えた、削除された、プロパティの値が変わったなど、どのレコードがどのように変わったかを細かく知ることができる
- 変更に対してブロックで変更を受けてUIを更新するということができる
- TableViewに向いている
全体を書き換える必要はなく、変更があったところだけアニメーションで変化させるなどということができる
- 全てが遅くなってしまわないようにしている
逆に、UIの操作によってデータが変わることもある
- データを更新する場合、Realmではトランザクションを使う決まりになっている
Transaction
- モデルのプロパティはRealmのテーブルのカラムを表している
- これを変える場合にはTransactionを介して変更する
- トランザクションを開いて閉じるというAPIもあるが、blocksで変更できる
- 自動で閉じてくれる
- ここまでが基本的な部分の解説
- Realmは高速に動くし、簡単なAPIで動くように設計されている
- マルチプラットフォームで使えるようになっている
Seamless Data Sync for Realtime Apps and Collaborative Features
- 開発時にたくさんの要望をもらった
- データの同期のリクエストが多かった
- その問題を解決するためにサーバサイドの連携機能をもったモバイルプラットフォームを開発
- サーバからデータをダウンロードしてクライアントで変更してそれをサーバに送るのは簡単ではない
- Realmが肩代わりして任せてしまえるようになっている
Realtime sync with REST
- データを同期するアプリは簡単ではない
- 難しさを表現するためにこの図をよく使っている
- やりたいことは氷山の部分
- リクエストしてデータ受け取ってUIをアップデートする
- でも考えなければ行けない要素がいっぱいある
- 最初は接続できてたけど途中で繋がらなくなったとか
- これに加え、1人目のユーザは成功したけど2人目のユーザが失敗した時、など考えなければいけない
- やりたいことは氷山の部分
- この図にあるようにエラーが起こる時はたくさんある
- 全てに対処するのは大変
- エラーを全て網羅してもうまくリトライするのは難しい
The Realm Mobile Platform vs REST API
- Realmを使った場合RESTを使った場合と異なる
- 自分でjsonをパースしたりする必要はない
- 基本的にサーバとクライアントの状態が不一致になるということはない
- サーバではMySQLでクライアントではSQLiteというのとは違う
- デバイスにあるものとほぼ同じものをサーバで開いて編集できるイメージ
- 同時に複数人が同じ行、同じカラムを変更しようとするとコンフリクトしそうだが、Realmが自動的に頑張ってくれる
- その挙動をカスタマイズすることも可能
- Realmを使うことによって特別にネットワークとやりとりするものを書く必要はない
- 本当に簡単に書けるようになる
- REST、jsonと違ってデータの変更を書く必要がない
- ローカルのデータベースを使っているときと同じようにローカルのDBに保存するという処理をやればいい
- データ転送は極力少なくなるように最適化している
- あるモデルのあるプロパティを変更したという場合はその差分だけが送られる
- オンラインの場合は常にデータが同期することが保たれる
Changing your apps architecture from this…
- RestAPIを使う場合はこのように複雑になっている
- それだけで済めばいいが何かダウンロードした後にサーバ側に反映する前に他のユーザが変更した場合は何かしらの対処をしなければならない
- 不具合を出さずに保つのは結構大変なこと
…to this
- 先程の複雑なアーキテクチャ全てのいろいろな渾然一体になっていたものから、Realmを使うとシンプルに、Realmだけを使ったアーキテクチャにすることができる
- この場合だとjsonからオブジェクトに直したりしなくてもいい
- もしサーバサイドで別のシステムと連携しても、サーバサイドにもRealmのAPIがあるのでそれを使えばモダンなやり方で徐々に変えていくことができる
- データ連携のAPIを使ってサーバサイドの玄関だけでも置き換えるということが可能
Data Access API
- サーバサイドでRealmを使う時の例
- 先程のクライアントのコードと同じような形で書くことができる
- このコードではRealmのオブジェクトサーバに接続する部分は省き、変更するところだけ書いている
- 接続するコードは1,2行の話
- 変更する時にはTransactionがあってサーバで加えた変更は自動でそれぞれのクライアントに同期される
- 今までAPIを通じてやっていたことをRealmで置き換えられる
More Server Features
- これまで紹介してきた基本的な機能に加えてRealmのモバイルプラットフォームが提供しているサーバサイドの機能はこちら
- 通信はSSLで暗号化される
- 同期はリアルタイムで行われている
- ロードバランサや複数のサーバに負荷を分散させて 水平方向のスケーラビリティを増やす機能もある
- 何かサーバに障害があってもある時点のバックアップを復元する機能もある
Demo #1
Realm Mobile Platform
- realm.ioのページから試すことができる
- このスクショにあるようなTodoアプリも入っているのですぐに試すことができる
- サーバと同期する部分、TableViewを使った時のテクニックを学ぶことができる
- Java, ReactNativeなどを使ったサンプルある
- OSSではないが無料で使うことができる
- サーバサイドのロジックを書く場合は料金が必要になるが、2ヶ月のトライアル期間がある
- フィードバックください
We’re hiring
- Realmを使うのは簡単
Realmを使ってアプリ作ったらぜひ教えてほしい
- それを見て自分としても改善していくべきことが見つかる
自分はRealmの中で初めてリモートで働き始めたうちの一人
- 世界中でリモートで働いている人もいる
- Realmで働くことに興味があれば連絡ください
Question
RealmDBに画像のバイナリデータを入れるというのは良いアイディアでしょうか。何か他の方法があるでしょうか。
- 一般的にはあまりいい方法ではない
- クエリにヒットするわけでも、ソートできるわけでもないので
- AWSやその他既存サービスに保存してURLを保存した方が
Webコンソールや管理画面でパーミッション変更を行えるようにする予定はあるのか
- Webコンソールを用意する予定はある
- ユーザ一覧見たり追加したりする画面があるがそれに入れるつもり
データを同期するソリューションはFirebaseなど他にもあるが使い所は?
データ共有をテーブルやオブジェクトの管理単位でできるのか
モバイルプラットフォームは実際の製品でどのような場面で使われているか
- 具体的な名前は言えないがローンチする前から協力してもらった病院がある
- どこに病院があるかを探すアプリ
- その他データ配布するためにつかっていた
- 暗号化で使われたり
- まずはRealmのサンプルを見るといろいろわかる
- Todoアプリは典型的な、APIをRealmで置き換えている例