Realm Blog

Realm Objective-C & Swift 0.98

Realm Objective-CおよびRealm Swift 0.98をリリースしました。

このバージョンにはコレクションの変更に対する通知、非同期クエリ、サブクエリ、インデックスとパフォーマンスの改善、不具合の修正などが含まれます。

コレクションの変更に対する通知

コレクションオブジェクトが変更されるたびに呼ばれる通知ブロックをaddNotificationBlockメソッドを用いて登録できるようなりました。

コレクションインスタンスに対して通知を登録すると、非同期にクエリを実行し、結果を取得したらブロックを呼び出します。その後、結果に影響のあるトランザクションがコミットされるたびに通知ブロックを呼びます。

// RLMResultsの通知を監視します
self.token = [[Person objectsWhere:@"age > 5"] addNotificationBlock:^(RLMResults *results, NSError *error) {
    // results is identical to '[Person objectsWhere:@"age > 5"]'
    [myViewController updateUI];
}];

// 通知が不要になったら
[self.token stop];
// RLMResultsの通知を監視します
let token = realm.objects(Person).filter("age > 5").addNotificationBlock { results, error in
    // results is identical to 'realm.objects(Person).filter("age > 5")'
    viewController.updateUI()
}

// 通知が不要になったら
token.stop()

詳しくはドキュメントの通知のセクションと下記のAPIドキュメントをご覧ください:

Objective-C Swift
-[RLMRealm addNotificationBlock:] Realm.addNotificationBlock(_:)
-[RLMCollection addNotificationBlock:] AnyRealmCollection.addNotificationBlock(_:)
-[RLMResults addNotificationBlock:] Results.addNotificationBlock(_:)
-[RLMArray addNotificationBlock:] List.addNotificationBlock(_:)
-[RLMNotificationToken stop] NotificationToken.stop()

これはキー値監視から始まった基礎的な部分の上に成り立っています。より細かな通知ができるように近い将来の改善を予定しています。

バックグラウンド・クエリ

コレクションの変更に対する通知は、クエリの実行結果が常に「最新の状態」を保つ仕組みを改善しました。

一度クエリが実行される、または通知ブロックが登録された場合、クエリの実行結果は常に最新の状態が保たれます。Realmに変更があったとき、可能ならバックグラウンドスレッドでクエリを実行します。

この変更はResultsオブジェクトを直接テーブルビューのデータソースとして利用する場合の作業を減らします。これはRealmの使い方として推奨するデザインパターンです。

サブクエリ

このバージョンからサブクエリをサポートしました。これまで不可能だったり効率が悪かったクエリを実行できるようになりました。

下記の例は、以前のバージョンでパートタイムで(=フルタイムでない)30歳以上のEmployeeオブジェクトを検索します:

let partTimeOverThirty = realm.objects(Employee).filter("age > 30 AND fulltime = NO")
let companies = realm.objects(Company).filter("ANY employee IN %@", partTimeOverThirty)

しかし、上記のクエリは非常に実行コストが高く、また自動更新が期待するように動作しません。また、件数をゼロ以外の値と比較することが困難です。

サブクエリを使うとこのように書けます:

let companies = realm.objects(Company).filter(
  "SUBQUERY(employees, $employee, $employee.age > 30 AND $employee.fulltime = NO)[email protected] > 0"
)

しかしながら、今のところサブクエリには下記の制限があります:

  • サブクエリに適用できる集計関数は@countだけです。
  • SUBQUERY(…)[email protected]と比較できるのは定数だけです。
  • 相関サブクエリはサポートされていません。

インデックスとパフォーマンスの改善

BOOL/BoolNSDate型のプロパティに対してインデックスが使えるようになりました。Realm SwiftにおいてOptional型のプロパティが正しくインデックスされるようになりました。

1つ以上のインデックス付きのプロパティを含むオブジェクトの削除のパフォーマンスが大幅に向上しました。

非互換の変更

  • Realm SwiftにおけるSwift 1.2のサポート終了しました。Swift 1.2をサポートする最後のバージョンは0.97.1になります。
  • +[RLMRealm realmWithPath:]/Realm.init(path:)はデフォルトのRealmコンフィギュレーションの値を引き継ぐようになりました。

細かな改善

バージョン0.97.1に含まれる変更です。

  • Swift: Error enumを追加し、エラーをキャッチできるようになりました。例: RLMRealm/Realmインスタンスの初期化時に発生するエラー。
  • 読み込み専用としてRealmを開こうとしてファイルが見つからなかった場合、あるいはあるいはコピー先のディレクトリが見つからなかった場合に、より一般的なRLMErrorFileAccessエラーではなく、RLMErrorFileNotFoundを投げるようになりました。

不具合の修正

バージョン0.97.1に含まれる変更です。

  • -[RLMResults setValue:forKey:]をそのキーで検索して得られたRLMResultsに対して使用したとき、間違った結果を返す、またはクラッシュする不具合を修正しました。
  • 別のスレッドで解放されたRLMRealmにアクセスしてクラッシュする不具合を修正しました。
  • 削除されたオブジェクトを含むResults/RLMResultsに対して集計関数を使用すると間違った結果を返す、またはクラッシュする不具合を修正しました。
  • 100万件を超えるオブジェクトが保存されているクラスに新しくプロパティを追加するとクラッシュする不具合を修正しました。
  • writeCopyToPathによって作られた暗号化Realmを開く際に起こるエラーをを修正しました。
  • 関連を条件にしたクエリを実行して得られたRLMResultsに対して、その関連が削除された後、自動更新が働くと、間違った結果を返す、またはクラッシュする不具合を修正しました。

お読みいただきありがとうございます。 Realm で素晴らしいアプリケーションを作りましょう!Stack OverflowGitHubTwitterでお待ちしています。


Realm Team

At Realm, our mission is to help developers build better apps faster. We provide a unique set of tools and platform technologies designed to make it easy for developers to build apps with sophisticated, powerful features — things like realtime collaboration, augmented reality, live data synchronization, offline experiences, messaging, and more.

Everything we build is developed with an eye toward enabling developers for what we believe the mobile internet evolves into — an open network of billions of users and trillions of devices, and realtime interactivity across them all.

記事の更新情報を受け取る