2013-08-29 14 views
5

Mam funkcję, która łączy się z Internetem, a następnie odświeża komórki w tabeli.UITableView reloadData jest powolny

Moja funkcja to:

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


     }]; 
    }]; 
} 

Wszystko jest super szybki wyjątkiem [homeTable reloadData]. Kiedy to skomentuję, mam szybką odpowiedź. Kiedy odkomentuję to, odpowiedź mojej komórki może być opóźniona o kilka sekund!

Moje inne połączenia resloadData nie opóźniają mojej aplikacji. Czy nie wdrażam poprawnie NSOperationQueue?

+0

Czy możesz spróbować załadować tylko widoczne komórki? Jeśli twoje źródło danych zostało zaktualizowane, zanim użytkownik przewinie w dół, może być szybsze, np. [HomeTable reloadRowsAtIndexPaths: [homeTable indexPathsForVisibleRows]] – Max

+0

Pokaż metody delegatów widoku tabeli. Do czego służy 'getColumnDataBackground'? Skąd wiadomo, że powoduje "opóźnienie"? – Wain

Odpowiedz

6

Usuń kolejki z metody aktualizacji i pozostaw tylko aktualizację tabeli. Pod działaniem, które odświeża twoją tabelę, dodaj ten kod. Gdzie updateMethod jest kodem, który aktualizuje tabelę. Dopiero po powrocie do głównego wątku przeładujesz dane. Mam nadzieję że to pomoże!

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

Ten kod prawdopodobnie spowoduje wyścig, gdy wątek tła i główny wątek jednocześnie uzyskują dostęp i modyfikują wyświetlane dane. – CouchDeveloper

Powiązane problemy