2011-11-03 9 views
8

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.

risposta

16

Tutti,

Così, ho capito (o quasi). Immagino che abbia qualcosa a che fare con i thread, non dovevo fare cose UI in quel thread.

Per risolvere il problema, ho circondato la roba tavolo con del codice di dispacciamento:

[account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) 
{ dispatch_async(dispatch_get_main_queue(), ^{ 
    ... 
});}]; 

ancora bisogno di capire che cosa sta succedendo qui, ma spero che questo aiuterà se qualcuno corre nello stesso problema.

+0

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'. –

+0

Grazie amico, ha avuto lo stesso problema con un'altra vista in ritardo. Questo l'ha risolto per me. – thgc

+2

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

Problemi correlati