Realm Objective-C & Swift 2.0 – Mobile Platformをサポート
Realm Objective‑CおよびRealm Swift 2.0をリリースしました。 このバージョンではRealm Mobile Platformに対応し、サーバサイドとデータの同期が可能になりました。 加えて、Swift 3の対応と不具合の修正のために非互換の変更が1つだけ含まれます。詳しくは下記をご覧ください。
Realm Mobile Platform拡張
Realm Mobile Platformのリリースのお知らせをご覧になっていない方は先にそちらをお読みいただき、その後この記事でCocoaに関する詳細を確認してください。
まず簡単にデータ同期を有効にする設定をご紹介します、
// Authenticating the User
User.authenticate(with: .google("google token"),
server: URL(string: "https://realm.example.com:9443")) { user, error in
if let user = user {
// Opening a remote Realm
let realmURL = URL(string: "realm://realm.example.com:9080/~/userRealm")!
let config = Realm.Configuration(syncConfiguration: (user, realmURL))
let realm = try! Realm(configuration: config)
// Any changes made to this Realm will be synced across all devices!
} else if let error = error {
// handle error
}
}
これだけです。一度設定を有効にすれば、あとは自動的にすべてのデバイスでデータが同期されます。
ここからは技術的な詳細についてお話しします。Mobile Platformに対応するために、新しいクラスとAPIを追加しました。
同期ユーザオブジェックトと認証オブジェクト
同期ユーザはRealmを同期するための中心的な概念です。すべてのRealmはユーザに関連付けられます。ユーザはユーザ名/パスワードもしくは、Google、Facebook、iCloudなどの外部プロバイダによって認証することができます。詳しくはドキュメントのUsersセクションをご覧ください。
同期設定
Realmの同期設定を有効にするには、RLMRealmConfiguration/Realm.Configuration
クラスのプロパティsyncConfiguration
をセットします。syncConfiguration
には同期ユーザとリモートRealmURL(例: realm://realm.example.com:9080/~/userRealm
)のペアを渡します。詳しくはドキュメントをご覧ください。
同期マネージャとセッション
同期マネージャ(RLMSyncManager
/SyncManager
)はシングルトンオブジェクトで、すべての同期されたRealmを管理します。同期エンジンのログレベルの設定や、グローバルエラーのハンドリングはこのクラスを通じて行います。
それぞれの同期されたRealmはセッション(RMLSyncSession
/SyncSession
)に関連付けられます。セッションはRealmの状態を表します。今後、より詳細な情報が取得できるように改善される予定です。
プラットフォーム拡張はベータ版です
これまでRealmは5年かもの間、改善を繰り返し、安定した動作を獲得しました。同様にAPIを少しずつ改善していくため、プラットフォーム拡張は現在ベータ版としてリリースしています。APIは今後のリリースで変更される場合があります。
プラットフォーム拡張は、ローカルのRealmと同期されたRealmと明確に区別して設計されていますので、プラットフォーム拡張が不要な場合でも、これまでと同様にRealmを安定して利用することができます。
2.0には非互換の変更は「ほとんど」ありません
このリリースは大きな新機能を含むためにメジャーバージョンアップとなります。しかし、APIに非互換の変更はほとんど加えていません。なぜなら、直前のメジャーバージョンアップである1.0のリリースはわずか数か月前であるので、非互換のAPIに対応する時間を費やすことは避けたかったのです。
ただ1つだけ例外があります。Swift 3に対応したRealm 1.1.0を先日リリースしましたが、その際に、Error
クラスがそのままでは標準ライブラリののSwift.Error
とコンフリクトして使いづらいというフィードバックを数多くいただきました。そこで、Error
クラスはRealm
のエクステンションとしてネストした型に変更することにしました。今回のリリースにおける非互換の変更はこの1つだけです。
注意:Realm Objective-CおよびSwift 2.0はファイルフォーマットが刷新され、パフォーマンスの改善と不具合が修正されています。そのため、バージョン2.0で作られたファイルは1.x以前のバージョンからは読み込むことができなくなります。古いバージョンで作られたファイルを新しいバージョンのRealmで読み込むことは問題ありません。
関連ファイルの削除
.log
、.log_a
、.log_b
という拡張子のファイルはRealmファイルに統合されたため、作られなくなりました。それにより、ファイルを開くときや、書き込みのパフォーマンスが向上し、トランザクション中に別のファイルを開く際の速度低下をなくすことができました。
不具合の修正
- ゼロのプロパティでソートしたときにアサーションエラーが起こる問題を修正しました。
- 同じファイルを開いている複数のプロセスがあるとき、コミットの途中で1つのプロセスがクラッシュすると、他のすべてのプロセスもクラッシュしてしまう問題を修正しました。
- オプショナルのfloatもしくはdouble型のプロパティが既存のモデルに追加されたとき、ゼロでなく正しく初期化されるようになりました。
- インデックスが付加されたString型のとても長いプロパティがスタックオーバーフローを引き起こす問題を修正しました。
- 非同期クエリ、またはコレクションに対する通知において、クラッシュを引き起こすレースコンディションを修正しました。
- 自分自身に関連付けられたオブジェクトを削除しようとした際に、データが不整合になる問題を修正しました。
Q: 新しくオープンソースとして公開されたRealm CoreストレージエンジンをRealmと組み合わせて使えますか?
もちろんです!100%完全なオープンソースになったRealmをビルドして利用することができます。インストールの手順は、例えばCocoaPodsを使った場合(pod install
するだけ)よりも複雑になりますが、realm-coreとrealm-cocoaに記してある手順にしたがってください。
現在ocoaPodsを使って完全にソースコードからビルドできるように準備しています。楽しみにしていてください!
Xcode 7.3.1とSwift 2.2でも引き続きご利用いただけます。できるだけ早くXcode 8とSwift 3またはSwift 2.3に移行することをお勧めします。
お読みいただきありがとうございます。 Realm で素晴らしいアプリケーションを作りましょう!お困りの際はStack Overflow(日本語)、 Slack(日本語)、Twitter(日本語)、GitHub(英語)でご相談ください。