とりあえずやってみればいいじゃん

とりあえずやってみればいいじゃん

エンジニア関連のことについてつらつら書くブログ

3/19 Realm World Tour - Recent Updates(主にObjective-C/Swift) #realmworld

アジェンダ

  • The Realm Mobile Platform Experience
  • Product updates
  • Guest presentations
    • Ito
    • Fumihiko Siroyama
  • Introduce Error Prone
  • Realm Mobile Platform Demo

Recent Updates @岸川さん

f:id:akatsuki174:20170321230753j:plain

  • 前回のmeetupからiOSはマイナーバージョンが3つほどアップデートされている
  • Swift2.4はもう出たか、まもなく出る
  • Javaはメジャーバージョン上がったので若干のブレークチェンジがある
  • Realm Node.jsが初めてリリースされた
  • React NativeとXamarinはβから1.0に
  • React NativeとXamarinでrealmのシンク機能が使えるように

Realm Objective-C / Swift 2.2

f:id:akatsuki174:20170321230757j:plain

  • マルチスレッドで使う場合の利便性が大きく向上
  • 関連の関連、などでソートすることもできるように

Multi threading

f:id:akatsuki174:20170321230812j:plain

  • 別のスレッドで作ったものをスレッドまたいで使うことはできなかった
    • 実行時に例外が発生していた
    • カジュアルに渡してしまいがちだが例外が発生してしまう
    • それぞれのスレッドでRealmを作り直さなければいけない
    • こういったことを何度も書くのは煩雑
    • 一度使ったオブジェクトは基本的に持っている

Thread Safe Reference

f:id:akatsuki174:20170321230801j:plain

  • そのまま渡すことができる
  • resolveメソッドを呼ぶとラップした時のオブジェクトを取り出す事ができる
  • あたかもそのまま渡ってきたかのように使うことができる
  • 場合によってはプライマリキーがないことがあって、その場合同じオブジェクトなのかを判別するのが難しかった
  • →プライマリキーがなくても素直に書けるようになった

  • 注意しなければいけないこと

    • resolveは1回だけしか呼べない
      • 内部の実装の問題なので作業中の改善
      • これが解決すれば何度もresolveを呼ぶことができるようになる予定

Sorting By Relationship properties

f:id:akatsuki174:20170321230809j:plain

  • 記事のコメントを1対多で持っている
  • ユーザごとに記事を並べ替えたい場合はチェーンするかarticleに対してソートメソッドをかける
  • ユーザの名前を変更したらuserNameも変更しなければならなかった

f:id:akatsuki174:20170321230817j:plain

  • user.nameで引っ張ってこれるようになった
  • articleでユーザ名を持つ必要がなくなった

API Changes

f:id:akatsuki174:20170321230822j:plain f:id:akatsuki174:20170321230825j:plain

  • 古いメソッドはdeprecatedに
  • 次のメジャーバージョンアップでは左のメソッドは使えなくなる

同期の進捗状況の通知

f:id:akatsuki174:20170321230917j:plain f:id:akatsuki174:20170321230834j:plain

  • 今何かダウンロードしているのかなどがわからなかったがわかるようになった
    • enumでアップロード、ダウンロードなどの区別ができるようになった
  • 1回ダウンロードが終了したら通知されなくなるのかなどを指定できるようになった
  • 容量の大きなデータを保存した時に逐次プログレスバーを表示したいなどがあればこれを使う
  • ダウンロードしている時は常にインジケータ出したり

アクセスコントロール

f:id:akatsuki174:20170321230839j:plain f:id:akatsuki174:20170321230842j:plain f:id:akatsuki174:20170321230847j:plain

  • 今までchangeを使ってやっていた
  • このユーザがこのユーザに対して許可するなどができるようになった
  • googleスプレッドシートのシェアURLだと誰でも閲覧可など

f:id:akatsuki174:20170321230924j:plain

  • 期限を設定することもできる
  • read/write/管理権限を設定することができる(管理権限はあまり付けないと思う)
  • ここで失敗するのは自分のURLではないときなど
  • APIの通信処理を一切書いていないということがわかる
    • ただ、もうちょっと簡単に共有したい
    • →コンビニエンスAPIを作成中
    • コールバックベースでわかるようになる予定

Realm Objective-C / Swift 2.4

f:id:akatsuki174:20170321230851j:plain


Realm Notifications

f:id:akatsuki174:20170321230855j:plain

  • Realmに何らかの変更があった場合、何でも呼ばれる
  • クライアントサイドではあまり使われないと思う

Collection Notification

f:id:akatsuki174:20170321230859j:plain

  • 1対多などの関連を表すときなどに使う
  • オブジェクトに変更があった時、このコレクションはどの行が変更されたかの情報も合わせて渡してくれる
    • そのため綺麗にアニメーションさせて反映させることも可能
  • 変更内容が渡ってくるというのが先程のものとの大きな違い

オブジェクトレベルの通知

f:id:akatsuki174:20170321230903j:plain

  • オブジェクト(各インスタンス)に対してnotificationをセットできる
  • どのプロパティが変更されたかがわかるようになっている
  • オブジェクト自体が削除されてもその情報が来る
  • 例:メール画面で未読管理しているところを考える
    • それぞれ未読既読のフラグを持っている
    • 詳細画面に遷移したら未読をクリアする処理を詳細画面側でする
    • 一覧画面でUIを変えるというのが簡単に書けるようになっている
    • 詳細画面で起こった変更に対して一覧画面でインタラクションしたいということができる
  • 新しく出たAPIなので改善あればフィードバックを

質問

  • スレッドセーフの話があったが、Realmのインスタンス自体を渡すことはできるのか
    • Realmのインスタンスはスレッドをまたげない
    • オブジェクトのためのもの
  • Realmのインスタンス自体をスレッドに渡したい時にスレッドセーフリファレンスが使えるのか

    • Relamのインスタンスがスレッドをまたぐことはできないはず
    • できなかった場合はRealmを各スレッドで生成する
    • Ralem渡したいのであればrealm configなどを渡して受け取った側でインスタンスを作るなど
  • データ変更監視がRxSwiftで監視しているのとで食い合ってしまう気がするのだがどっちを使うべき?

    • 使えるならRealmオブジェクトに対してはRealmの仕組みを使った方が
    • 他の方法で変更監視しようとするとパフォーマンスに影響が出ることがある
    • オブジェクト1つくらいだったらrxの仕組み使った方がわかりやすいなら別でやることはできる
    • Realmオブジェクトをプレーンなオブジェクトに直して使うなどもありえる
  • 今後リレーションを作る時の特定のプロトコルでリレーション作れる?

    • 予定はある
    • 実装が始まっているわけではない

togetter

3/19 Realm World Tour #realmworld - Togetterまとめ