2013-08-29 12 views
5

Ich habe eine Funktion, die mit dem Internet verbindet und dann aktualisiert die Zellen in der Tabelle.UITableView reloadData ist langsam

Meine Funktion ist:

- (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]; 


     }]; 
    }]; 
} 

Alles superschnelle ist mit Ausnahme von [Homereload]. Wenn ich das kommentiere, habe ich eine schnelle Antwort. Wenn ich es auskommentiere, bleibt meine Zellantwort manchmal um einige Sekunden zurück!

Meine anderen reloadData-Aufrufe verzögern meine App nicht. Implementiere ich NSOperationQueue nicht korrekt?

+0

Können Sie versuchen, nur die sichtbaren Zellen nachzuladen? Wenn Ihre Datenquelle aktualisiert wurde, bevor der Benutzer nach unten scrollt, ist sie möglicherweise schneller, z. B. [homeTable reloadRowsAtIndexPaths: [homeTable indexPathsForVisibleRows]] – Max

+0

Zeigen Sie die Delegate-Methoden für Tabellenansichten an. Was macht 'getColumnDataBackground'? Woher weißt du, dass es eine "Verzögerung" verursacht? – Wain

Antwort

6

Entfernen Sie die Warteschlangen von Ihrer Update-Methode und lassen Sie nur, was die Tabelle aktualisiert. Fügen Sie unter der Aktion, die Ihre Tabelle aktualisiert, diesen Code hinzu. Wobei updateMethod der Code ist, der die Tabelle aktualisiert. Nur wenn Sie wieder im Hauptthread sind, laden Sie die Daten neu. Hoffe das hilft!

//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

Dieser Code wird wahrscheinlich ein Rennen verursachen, wenn Hintergrund- und Hauptthread gleichzeitig auf die angezeigten Daten zugreifen und sie ändern. – CouchDeveloper

Verwandte Themen