2016-03-20 5 views
2

私のCore Dataラッパーから私のアプリケーション用のRealmへの移行を検討していますが、その1つは、Realmがどのようにクエリの型を推論するのではなく、述部に文字列を使用するかです。レルム・スウィフトの文字列述語ではなく、クエリで型を推論しますか?

例えば、なぜ私はこれを行うにしています:

Realm().objects(Dog).filter("age < 5").sorted("name")

の代わりにこのようなスウィフト方法:

Realm().objects(Dog).filter { $0.age < 5 }.sorted { $0.name }

そして、私は何かが足りないか、これは本当にあるのあなたはRealm for Swiftをどのように使うのですか?

+0

これらの方法に関する領域文書はどこにありますか? – nhgrif

+0

クエリセクション:https://realm.io/docs/swift/latest/ – TruMan1

答えて

3

Swiftのビルトインコレクションフィルタリング手法を使用する方が、RealmのNSPredicateインターフェイスをクエリに使用するよりも効率が悪いです。

Swiftのビルトインコレクションフィルタリングの効率が悪い主な理由は、レルムに格納された各オブジェクトにSwiftオブジェクトを割り当てる必要があるということです。スウィフトが$0.age < 5のような式を評価するためにスウィフトオブジェクトがメモリ内に存在しなければならないので、これは必要です。 NSPredicateを使用すると、Realmは述語を内部クエリー形式に変換できます。内部クエリー形式は、Realmに格納されたプロパティに対して直接評価することができ、Swiftモデルクラスのインスタンスを割り当てません。結果セット内のオブジェクトにアクセスすると、インスタンスを遅延割り当てすることができます。

レルムのクエリ実行エンジンは、実行されているクエリのセマンティクスを理解すると、さらに多くの最適化を実行できます。たとえば、索引を使用して、索引付きプロパティーを使用するときに、より効率的に照会を実行することができます。述語がSwiftクロージャであった場合、その動作はRealmに対して不透明になり、これらの最適化が妨げられます。

非常によく似た理由から、NSPredicateもコアデータによるクエリに使用されていることを指摘する価値があります。

関連する問題