まず、Realmはほとんどの場合十分に高速であるため、バックグラウンドでクエリを実行する必要はありません。
したがって、基本的な戦略は次のとおりです。バックグラウンドで更新し、メインスレッドでフェッチします。
最も一般的な方法は、ライブアップデートの機能を活用することです。 RLMResults
とResults
にはライブアップデートがあります。クエリでRLMResults
/Results
のインスタンスを保持できます。次に、バックグラウンドスレッドで何らかの変更を加え、変更が通知され、コミット時に自動的に反映されます。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// RLMResults is updated automatically
return self.array.count;
}
詳細については
// Update in background
- (void)backgroundAdd
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// Import many items in a background thread
dispatch_async(queue, ^{
// Get new realm and table since we are in a new thread
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for (NSInteger index = 0; index < 5; index++) {
// Add row via dictionary. Order is ignored.
[DemoObject createInRealm:realm withValue:@{@"title": [self randomString],
@"date": [self randomDate]}];
}
[realm commitWriteTransaction];
});
}
// Reload table view when changed by other threads
__weak typeof(self) weakSelf = self;
self.notification = [RLMRealm.defaultRealm addNotificationBlock:^(NSString *note, RLMRealm *realm) {
[weakSelf.tableView reloadData];
}];
// Hold RLMResults for the data source
self.array = [[DemoObject allObjects] sortedResultsUsingProperty:@"date" ascending:YES];
、あなたは
table view example in Realm's repoを見ることができます。
メインスレッドでフェッチするときにRealmが十分に速くならないケースがいくつかある場合は、バックグラウンドスレッドでフェッチできます。次に、主キーの配列を集約します。次に、配列を渡して、プライマリキーを使用してメインスレッドで再度フェッチします。
FYI:クエリを非同期で実行するためのサポートを追加するように取り組んでいますhttps://github.com/realm/realm-cocoa/pull/2842 この機能がリリースされる場合、主キーを集約して再フェッチする必要はありません。
realmオブジェクトを自分の素早いオブジェクトに構文解析して返すのはどうでしょうか?再フェッチに時間がかかりますか?もう1つの質問ですが、メインスレッドでレルムを使用すると、レルムインスタンスを取得するベストプラクティスは何ですか?私は、アプリケーションの代理人または他のどこかに静的インスタンスを置く必要があり、必要なときにこの参照を使用するか、各場所でレルム参照を作成する必要がありますか? –
更新はどうですか?メインスレッドで読み込んだオブジェクトを使用して、バックグラウンドスレッドで更新を実行しようとすると、この例外が発生します: 'オブジェクトを別のレルムから追加できません' – Ixx
@Ixxレルムの使い方を誤解しています。レルムオブジェクトは他のスレッドに渡すことはできません。また、別のレルムからオブジェクトを追加することもできません。各スレッドでRealmインスタンスを作成し、Realmオブジェクトを再フェッチする必要があります。ただし、Realmオブジェクトは自動的に最新の状態になっています。だから、ベストプラクティスはメインスレッドでクエリを作成し、バックグラウンドスレッドを作成することです。レルムオブジェクトはライブであり、再クエリする必要はありません。 –