2016-01-19 14 views
9

私のアプリにRealmを使用しています。バックグラウンドスレッドで結果を照会し、それらを受け取ることができます。メインスレッド これを達成する最も良い方法は何ですか?レルムを使用するベストプラクティスは何ですか(メインスレッドとバックグラウンドで別の方法を使用していますか?メインでアプリケーション全体でレルムの静的インスタンスを使用していますか?別の良い方法でしょうか?)Realm:バックグラウンドスレッドからの操作を追加、更新、削除してメインスレッドで結果を得る正しい方法

このオプションを読んで見ました - レルムオブジェクトを自分のオブジェクトに構文解析し、それらを返す(結果のコピーの種類)。 - オブジェクトのキーを返し、メインスレッドから再度照会します。

誰でも私に教えてくれてありがとう、本当に大きな領域があると思うが、良いチュートリアルやベストプラクティスがない。

答えて

6

まず、Realmはほとんどの場合十分に高速であるため、バックグラウンドでクエリを実行する必要はありません。

したがって、基本的な戦略は次のとおりです。バックグラウンドで更新し、メインスレッドでフェッチします。

最も一般的な方法は、ライブアップデートの機能を活用することです。 RLMResultsResultsにはライブアップデートがあります。クエリで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 この機能がリリースされる場合、主キーを集約して再フェッチする必要はありません。

+1

realmオブジェクトを自分の素早いオブジェクトに構文解析して返すのはどうでしょうか?再フェッチに時間がかかりますか?もう1つの質問ですが、メインスレッドでレルムを使用すると、レルムインスタンスを取得するベストプラクティスは何ですか?私は、アプリケーションの代理人または他のどこかに静的インスタンスを置く必要があり、必要なときにこの参照を使用するか、各場所でレルム参照を作成する必要がありますか? –

+0

更新はどうですか?メインスレッドで読み込んだオブジェクトを使用して、バックグラウンドスレッドで更新を実行しようとすると、この例外が発生します: 'オブジェクトを別のレルムから追加できません' – Ixx

+0

@Ixxレルムの使い方を誤解しています。レルムオブジェクトは他のスレッドに渡すことはできません。また、別のレルムからオブジェクトを追加することもできません。各スレッドでRealmインスタンスを作成し、Realmオブジェクトを再フェッチする必要があります。ただし、Realmオブジェクトは自動的に最新の状態になっています。だから、ベストプラクティスはメインスレッドでクエリを作成し、バックグラウンドスレッドを作成することです。レルムオブジェクトはライブであり、再クエリする必要はありません。 –

関連する問題