2013-08-29 6 views
5

Ho una funzione che si connette a Internet e quindi aggiorna le celle nella tabella.UITableView reloadData è lento

La mia funzione è:

- (void) updateMethod 
{ 

    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.name = @"Data request queue"; 

    [queue addOperationWithBlock:^{ 

     //neither of these delay the responsiveness of the table 
     [columnArrayBackground removeAllObjects]; 
     [self getColumnDataBackground]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      for (int i=0; i < 6; i++) { 
       columnArray[i] = columnArrayBackground[i]; 
      }; 

      //THIS ONE LINE CAUSES DELAYS 
      [homeTable reloadData]; 


     }]; 
    }]; 
} 

Tutto è super veloce ad eccezione di [homeTable reloadData]. Quando lo commento, ho una risposta rapida. Quando lo disapprovo, la mia risposta cellulare è a volte di qualche secondo!

Le mie altre chiamate reloadData non ritardano la mia app. Non sto implementando correttamente NSOperationQueue?

+0

puoi provare a ricaricare solo le celle visibili? Se l'origine dati è stata aggiornata prima che l'utente scorresse verso il basso, potrebbe essere più veloce, ad esempio [homeTable reloadRowsAtIndexPaths: [homeTable indexPathsForVisibleRows]] – Max

+0

Mostra i metodi di delega della vista tabella. Cosa fa 'getColumnDataBackground'? Come sai che sta causando un "ritardo"? – Wain

risposta

6

Rimuovere le code dal metodo di aggiornamento e lasciare solo ciò che aggiorna la tabella. Sotto l'azione che aggiorna la tua tabella aggiungi questo codice. Dove updateMethod è il codice che aggiorna la tabella. Solo quando ritorni sul thread principale ricarichi i dati. Spero che questo ti aiuti!

//perform on new thread to avoid the UI from freezing 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), 
       ^{ 
        //background thread code 
        [self performSelector:@selector(updatemethod:) withObject:nil]; 
        dispatch_async(dispatch_get_main_queue(), 
            ^{ //back on main thread 
             [self.tableView reloadData]; 
            });}); 
+0

Questo codice causerà probabilmente una gara, quando il thread in background e il thread principale accedono contemporaneamente e modificano i dati visualizzati. – CouchDeveloper