In primo luogo, dal momento che il reame è abbastanza veloce nella maggior parte dei casi, non è necessario eseguire una query in background.
Quindi la strategia di base è; aggiorna in background, recupera il thread principale.
Il modo più generale è sfruttare la funzionalità dell'aggiornamento dal vivo. RLMResults
e Results
hanno un aggiornamento dal vivo. È possibile mantenere le istanze RLMResults
/Results
tramite query. Quindi apporterai eventuali modifiche al thread in background, le modifiche verranno notificate e riflesse automaticamente al momento del commit.
// Hold RLMResults for the data source
self.array = [[DemoObject allObjects] sortedResultsUsingProperty:@"date" ascending:YES];
// 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];
}];
- (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];
});
}
Per maggiori dettagli, si può vedere il table view example in Realm's repo.
Se in alcuni casi Realm non è abbastanza veloce durante il recupero sul thread principale, è possibile recuperare il thread in background. Quindi aggregare una matrice di chiavi primarie. Quindi passa la matrice e recupera nuovamente il thread principale utilizzando le chiavi primarie.
FYI: Stiamo lavorando per aggiungere il supporto per l'esecuzione di query in modo asincrono https://github.com/realm/realm-cocoa/pull/2842 Se questa funzione sarà rilasciato, non è necessario per aggregare le chiavi primarie e ri-fetch.
Cosa mi dici di analizzare gli oggetti del regno nei miei oggetti veloci e di restituirli? ci vorrà più tempo per riprendersi? e un'altra domanda, che dire dell'uso di realm sul thread principale, qual è la migliore pratica per ottenere l'istanza di realm? dovrei inserire un'istanza statica nel delegato di app o altrove e utilizzare questo riferimento ovunque mi serva o creare riferimenti di realm in ogni luogo in cui voglio ottenere i dati? –
E riguardo gli aggiornamenti? Se provo a eseguire un aggiornamento in un thread in background usando gli oggetti che ho letto nel thread principale ottengo questa eccezione: 'Non posso aggiungere oggetti da un diverso Realm' – Ixx
@Ixx Stai fraintendendo come usare il Realm. L'oggetto Realm non può passare ad altri thread, inoltre non può aggiungere oggetti da un Reame diverso. Dovresti creare un'istanza di Realm su ciascun thread e recuperare gli oggetti di Realm. Tuttavia, gli oggetti Realm sono live, aggiornati automaticamente. Quindi la best practice è interrogare sul thread principale, quindi scrivere thread in background. Gli oggetti Realm sono attivi, non è necessario ri-interrogare. –