2016-04-12 6 views
0

私のプロジェクトでRealmを使用する方法を学び始めました。素晴らしいですが、いくつかの欠点があります。スレッドの問題です。Realmのオブジェクトはスレッドセーフではなく、複数のスレッドで同時にアクセスできませんので、私はAlamofireからいくつかのデータを取得するたびに、私はObjectにマップし、それを保存し、いくつかの変更を計算するためにVCに戻し、UIを更新する、私はディスパッチUIを更新する前に、レルムを使って直接私はObjectクラスのクエリを維持する必要があります。Realmオブジェクトを直接操作するか、オブジェクトクラスにマップしますか?

Realmに質問し続けて直接作業したり、不変のクラスや構造体にマップしたり、別のスレッドですべてのRealmサービスを使用する方がよいかどうか質問したいと思いますか?

答えて

2

Realmオブジェクトはスレッドセーフではなく、スレッド間でやりとりすることはできませんが、マルチスレッド環境でRealmを使用するにはかなり難しい作業です。 :)

バックグラウンドスレッドのRealmインスタンスにいくつかの変更をコミットすると、実行スレッドの次回の繰り返しで、メインスレッドのRealmインスタンスが自動的に更新されます。メインスレッドにResultsのリストがある場合(つまり、UITableViewにRealmオブジェクトを表示する場合)、これらのオブジェクトも新しいオブジェクト/変更で自動的に更新されるため、UIが更新されるようにするだけですこれらの変化を説明するために :明示的なレルムモデルObjectで作業している場合は

(NBは。Realm他のスレッド内のインスタンスではなく、メインスレッドの場合は、明示的にそれらの変更にプルしRealm.refresh()を呼び出す必要があります)、それを渡したいです別のスレッドに作業を継続するのが最も簡単な方法は、現在のスレッドのRealmインスタンスに保存し、新しいスレッドのインスタンスRealmから再フェッチすることです。この場合、スレッド間でこの値を渡すことができるため、新しいスレッドでRealm.objectForPrimaryKey()を呼び出すだけで、同じオブジェクトを再フェッチするだけで、というスキーマにObjectスキーマを含めることをお勧めします。

詳細については、レルムのドキュメントページのThreading sectionを参照してください。現時点では、Realmオブジェクトがバックグラウンドで変更されたときに、UIアップデートを自動的にトリガするために、通知を簡単にする方法にも取り組んでいます。

(免責事項:私はレルムのために働く)

+1

は、だけではなく、上の主キーを渡すあなたが今 'ThreadSafeReference'を使用することができます(などのiOS、MacOSの、)レルム2.2のように、この答えを更新するには:HTTPS ://realm.io/news/obj-c-swift-2-2-thread-safe-reference-sort-properties-relationships/安全に処理された場合、RealmオブジェクトをSwiftオブジェクトにマッピングする際の価値はありますか、それともそれは時間の無駄です、そして、決して考慮されるべきではありませんか? –

関連する問題