Sto cercando di ottenere un elenco di account Twitter per caricare un UITableViewController che contiene i dati. Io uso questa funzione:(iOS 5) quando si ottiene l'elenco degli account Twitter, TableView si blocca?
- (void)viewDidLoad {
[accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
...
[[self tableView] insertRowsAtIndexPaths ...];
[[self tableView] reloadData];
NSLog("This message appears immediately");
...
}];
NSLog("This message appears immediately");
}
Per qualche ragione, l'interfaccia sembra "bloccarsi" per 5 secondi prima che il tavolo in realtà viene aggiornato/ridisegnata (notare che io chiamo reloadData!). Tutti i miei messaggi di registro vengono stampati immediatamente, quindi non sono sicuro di cosa stia causando l'interruzione dell'interfaccia.
Il problema è che le chiamate dell'interfaccia utente devono avvenire sul thread principale e '-requestAccessToAccountsWithType: withCompletionHandler:' non garantisce che il blocco di completamento venga richiamato sul thread principale. L'uso di 'dispatch_async' è corretto qui, anche se hai più elaborazione da fare prima delle chiamate dell'interfaccia utente, puoi farlo liberamente nella coda di background prima della chiamata' dispatch_async'. –
Grazie amico, ha avuto lo stesso problema con un'altra vista in ritardo. Questo l'ha risolto per me. – thgc
Il codice di esempio di Apple utilizza performSelectorOnMainThread: withObject: waitUntilDone: per gestire il fatto che il metodo del gestore viene eseguito su una coda arbitraria. – sam