GCD code invece di serrature: la lettura dei dati per cellForRowAtIndexPath di Tableview
-
10-10-2019 - |
Domanda
Il sito di una mela, non è suggerito modello per l'utilizzo di code GCD invece di serrature:
// Create queue early
queue = dispatch_queue_create("com.example.tweets", NULL);
// executed main thread
- (NSArray *)getTweets
{
__block NSArray *a;
dispatch_sync(queue, ^{
a = [tweets copyTweets];
});
return a;
}
// executed on background thread
- (void)addTweet:(Tweet *)tw
{
dispatch_async(queue, ^{
[tweets addTweet:tw];
});
}
Come si fa a trattare con le serrature e le sezioni critiche con GCD quando si dispone di un thread produttore aggiunta di un sacco di tweets in una volta, invece di uno per uno e avete bisogno di leggere un tweet alla volta per cellForRowAtIndexPath di UITableView?
Se hai tenuto la 'sincronizzazione' su ogni 'leggere', non sarà che causa un sacco di blocchi inutili? Questo è veramente scrivere una volta ogni tanto, ma di leggere spesso scenario ..
Soluzione
Se la latenza è un problema, forse il produttore deve aggiungere tweets uno per uno, in modo che le chiamate dispatch_sync dal thread dell'interfaccia utente rimangono reattivo.
Non vorrei preoccuparsi di "un sacco di blocchi inutili" a meno che / finché profiling mostra che l'invio blocco testa è in realtà un problema. Dopo tutto, cellForRowAtIndexPath è solo andare a essere chiamata per celle visibili, quindi significa "leggere spesso" qualcosa come decine di volte al secondo, non migliaia o milioni.