[iOs] Paginare i dati di una UITableView

Vi condivido il codice che ho messo su una repo di GitHub, utile per la paginazione dei dati caricati in una UITableView. Questa feature è molto comoda, quando dovete caricare troppi dati da un vostro servizio online e, dunque, la fase costituita dalla chiamata remota stessa, il fetching dei dati e il popolamento delle celle della vostra UITableView potrebbe risultare alquanto onerosa, se non addirittura far crashare la vostra app.

Ecco il link al progettino: https://github.com/fficetola/PaginationScroller

Prima di entrare nel vivo del codice, vi scrivo qui cosa viene fatto nell’app di esempio:

  • viene inizializzata una UITableView e nel metodo loadData, viene fatta una chiamata remota ad un servizio PHP di test (che vi ho anche condiviso nella cartella php-example-paging);
  • l’output in JSON del servizio di test lo potere vedere qui: http://francescoficetola.it/ios-test/test-paging.php?idx_last_element=0&block_size_paging=2. Nel servizio PHP di test, vengono passati due parametri: idx_last_element, ossia l’indice del primo elemento della lista di dati da cui si vuole partire, e block_size_paging, ossia il numero massimo di elementi che si vuol far restituire a partire dall’indice richiesto (nell’esempio precedente, si richiedono i primi 20 risultati dal primo elemento della lista, con indice 0). Il servizio PHP genera 100 elementi e, dunque, se si richiedono 20 elementi per volta, il numero massimo di pagine restituite sarà 5 (total_pages, è il numero massimo di pagine calcolate e restituite per la paginazione, current_page è la pagina corrente del blocco di dati richiesti)
  • Lato app, si intercetta il JSON di risposta e si “fetchano” i dizionari in singoli oggetti di tipo Object. 
  • Quando si scrolla la UITableView fino all’ultima cella, viene visualizzata una UIActivityIndicatorView, che scompare soltanto quando sono stati caricati altri blocchi di dati (si richiama, infatti, il metodo loadData).

Ecco il metodo della UITableView in cui vi è la vera e propria logica di paginazione:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    //check last cell in uitable
    if(indexPath.row==self.objects.count-1){

        //Create and add the Activity Indicator to splashView
        UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        activityIndicator.alpha = 1.0;
        //activityIndicator.center = CGPointMake(160, 360);
        activityIndicator.hidesWhenStopped = NO;
        [activityIndicator startAnimating];

        self.tableView.tableFooterView = activityIndicator;

        //arrest condition
         if(_currentPage<_totalPages){

             _lastIndex = indexPath.row+1;
             //timer...
             [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(loadData) userInfo:nil repeats:NO];

         }
         else{
             [activityIndicator stopAnimating];
             self.tableView.tableFooterView = nil;
         }

         [activityIndicator release];

    }
}

Il metodo willDisplayCell scatta per tutte le celle della UITableView, ogniqualvolta ognuna di queste viene visualizzata. Poiché a noi interessa rilevare soltanto quando è stata visualizzata l’ultima cella della tabella, vi è il seguente controllo:

if(indexPath.row==self.objects.count-1)

In tal caso, viene aggiunto nel footer della UITableView un UIActivityIndicatorView e, se non è verificata la condizione di arresto della paginazione, viene fatta una chiamata al metodo loadData in cui si richiama di nuovo il servizio remoto per la restituizione di un nuovo blocco di dati a partire dal lastIndex aggiornato.

Per determinare la condizione di arresto della paginazione, si va a controllare se la pagina corrente caricata (currentPage) sia l’ultima (totalPage):

if(_currentPage<_totalPages)

Se non si verifica tale condizione, viene eliminato lo spinner dal footer e viene terminata la paginazione (non viene più richiamato il metodo loadata).

UITableView pagination

Creative Commons License
This work by Francesco Ficetola is licensed under a Creative Commons Attribution 4.0 International License.
Based on a work at www.francescoficetola.it.
Permissions beyond the scope of this license may be available at http://www.francescoficetola.it/2013/03/31/ios-paginare-i-dati-di-una-uitableview/.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


7 − = uno