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

[LinkedOpenData&Graph] Il Linked Open Data Graph in tempo reale

Ho trovato un interessante progettino su GitHub che utilizza Protovis, libreria JavaScript ed SVG per la web-native visualizations (vedete anche questo interessante studio, A Scalability Study of Web-Native Information Visualization). Questo progetto permette di visualizzare su un grafo tutta la rete dei LOD (Linked Open Data) aggiornata direttamente dal portale CKAN, diventato il punto di riferimento per la registrazione dei datasets “LOD-compliant”.

Il progetto è stato scritto da Ed Summer ed è disponibile a questo link: https://github.com/edsu/lod-graph

Una anteprima dei LOD attualmente disponibili nella rete CKAN, visualizzati sul grafo Protovis di Ed Summer, la potete vedere anche qui: http://inkdroid.org/lod-graph/

Linked Open Data Graph

Se vi volete divertire a generare il grafo sui vostri pc, basta scaricare il progetto da GitHub e lanciare il comando da terminale:

./ckan.py

Lo script Python si connette alle API REST di CKAN, scarica i dati ed aggiorna un file locale ckan.log in cui potrete vedere lo stato di avanzamento delle operazioni (ci mette un po’…). Quando la procedura è ultimata (“finished ckan load” sul log), lo script vi genera un file lod.js in locale, con il JSON contenente tutte le informazioni sui dataset LOD aggiornati (titolo, url, rating, ecc.). Basta aprire la pagina index.html per visualizzare il Linked Open Data Graph su browser.

 

Altri riferimenti utili:

[iOs] Far votare o recensire un’app su Apple Store con Appirater

Volete invitare l’utente a lasciare un voto o una recensione sulla vostra app su Apple Store? Sono diverse le librerie che permettono di fare il rating, ma tutte di terze parti.

La libreria che vi consiglio, che è anche quella più utilizzata per tale scopo, è Appirater, di cui trovate una presentazione sul sito ufficiale del creatore:

http://arashpayan.com/blog/2009/09/07/presenting-appirater/

Il codice è scaricabile direttamente da GitHubhttp://github.com/arashpayan/appirater/

AppiraterScreenshot

Cosa vi permette di fare Appirater:

  • chiedere all’utente se vuole recensire e votare la vostra app su Apple Store, visualizzando una popup con opzioni
  • permettere di impostare quando visualizzare la popup, se dopo N giorni dall’installazione dell’app (o sua nuova release) sul device oppure dopo N utilizzi (uses) dell’app stessa
  • permettere di posticipare la recensione da parte dell’utente, ricordandogli di farlo dopo N giorni
  • oppure, se l’utente non vuole recensire l’app, “ricordare” tale opzione e non visualizzare più il messaggio di popup
  • i messaggi della popup sono localizzabili in varie lingue (compreso italiano)

Le opzioni sono configurabili nel file Appirater.h e le vedremo in dettaglio dopo aver definito come installare la libreria.

Installazione

  1. Scaricare da GitHub la libreria ed importare tutti i suoi file (comprese le cartelle delle lingue .lproj che vi interessano) nel vostro progetto
  2. Se utilizzate l’ARC (Automatic Reference Counting), poiché la libreria è un pò vecchiotta e non utilizza l’ARC, dovete marcare il file Appirater.m con il flag -fobjc-arc (basta andare sulla root del progetto, selezionare il target e nella scheda Build Phases » Compile Sources, in corrispondenza della classe Appirater.m, inserire il flag su citato cliccando due volte su tale classe)
  3. Aggiungete al vostro progetto i seguenti framework (sempre nella scheda Build Phases, sezione Link Binary with Libraries): CFNetworkSystemConfiguration e StoreKit. Assicuratevi di cambiare da Required ad Optional il flag del framework StoreKit, sempre nella sezione Build Phases » Link Binary with Libraries del target.
  4. Infine, potete utilizzare Appirater direttamente nel vostro AppDelegate.m, in corrispondenza del metodo application:didFinishLaunchingWithOptions:

Utilizzo. Un esempio di utilizzo di Appirater è il seguente: 

    //call the Appirater class
    [Appirater setAppId:YOUR_APPID];
    [Appirater setDaysUntilPrompt:1];
    [Appirater setUsesUntilPrompt:10];
    [Appirater setSignificantEventsUntilPrompt:-1];
    [Appirater setTimeBeforeReminding:2];
    //[Appirater setDebug:YES];
    [Appirater appLaunched:YES];

Tale codice è stato inserito nel metodo dell’AppDelegate application:didFinishLaunchingWithOptions:

Potete settare una serie di opzioni o come fatto nell’esempio precedente o modificando i valori di default dell’interfaccia Appirater.h.

Importante è inserire l’AppID della vostra app, così come visualizzata nelle informazioni relative all’app stessa sull’account di iTunesConnect. Per farvi rilasciare un AppID dovete aver pubblicata una vostra app sullo store o almeno registrato tutte le sue informazioni lì prima dell’invio ad Apple per l’approvazione.

Tra le opzioni che possiamo settare abbiamo:

  • + (void) setAppId:(NSString*)appId; permette di settare l’AppID dell’app (da prelevare su iTunesConnect)
  • + (void) setDaysUntilPrompt:(double)value;  setta il numero di giorni da quando è installata l’app (o una sua nuova release) dopo i quali visualizzare la popup di rating
  • + (void) setUsesUntilPrompt:(NSInteger)value; setta il numero degli “usi” (uses) dopo i quali si chiede all’utente se vuole votare. Un uso potrebbe essere il fatto che l’app si apra in primo piano nel device.
  • + (void) setSignificantEventsUntilPrompt:(NSInteger)value; setta il numero di eventi significativi prima di chiedere all’utente se vuol fare il rating
  • + (void) setTimeBeforeReminding:(double)value; setta il numero di giorni prima di rivisualizzare la popup di rating (una sorta di promemoria)
  • + (void) setDebug:(BOOL)debug; questa opzione è comoda per gli sviluppatori, perché consente di visualizzare immediatamente la popup per poter fare test o sviluppo. Tale opzione è da disabilitare quando si rilascia l’app sullo store.

Eccovi un altro riferimento utile (stavolta in italiano): http://www.htmedia.it/2012/03/tip-ios-31-chiediamo-una-recensione-con-appirater/

Buon rating!

CodeMotion 2013 a Roma: i giorni 22 e 23 Marzo

Codemotion2013

Programmare è un’arte. Sbaglia chi pensa che sviluppare software sia un’attività meccanica, sempre uguale, senza stimoli o fantasia. Noi ci mettiamo testa ma soprattutto cuore.

Anche quest’anno, non posso che consigliarvi l’appuntamento al CodeMotion all’Università Roma Tre, incontro ormai abituale per chi è appassionato di tecnologie di IT, che si terrà il 22 e il 23 Marzo prossimo.

In realtà l’evento dura più di due giorni (dal 20 Marzo al 23), perché si terranno anche dei workshop interessanti (peccato che capitino durante la settimana!).

Iscrivetevi all’evento qui: http://rome.codemotionworld.com/evento/conferenza/

PROGRAMMA: 

[Social Marketing] Il paradigma SoLoMo e i location-based engagement (LBE)

Leggendo un manifesto pubblicato sul sito di MomentFeed, dal titolo SoLoMo – or Just About Everything Marketers Need to Know about the Convergence of Social, Local, and Mobile, si parla della convergenza di tre aspetti che nello scenario tecnologico attuale stanno andando di pari passo, ossia la socializzazione, la localizzazione e la mobilità. Appunto, SoLoMo sta per Social-Local-Mobile.

MomentFeed-SOLOMO
Titolo: MomentFeed-SOLOMO (0 click)
Etichetta:
Filename: momentfeed-solomo.pdf
Dimensione: 3 MB

L’argomento sembra scontato, ma si possono cogliere degli aspetti interessanti, specie quelli riguardanti i servizi location-based che vengono offerti da vari brand di mercato e che sfruttano le informazioni su interessi, abitudine e sul sentiment dei clienti.
Il fenomeno del SoLoMo ruota prevalentemente attorno all’utilizzo degli smartphone, che “seguono” l’utente ovunque, raccogliendo e tracciando una miriade di dati personali che spesso, inconsciamente, vengono condivisi online su piattaforme che da questi traggono un immenso valore commerciale.

Si è nella cosiddetta post-PC era, dove milioni di persone si trovano online contemporaneamente in mobilità, non più usando solo il pc di casa o ufficio, e gli utenti hanno ormai quell’esigenza ossessiva di essere connessi con il mondo, per ricevere notizie non solo da persone ma anche da attività commerciali, per essere avvisati su offerte e occasioni.

Secondo la IDC Analyze the Future, il numero di persone che accedono ad internet dagli smartphone, tablet e altri dispositivi mobile sorpasseranno il numero di utenti connessi dal pc di casa o ufficio nel 2015. Secondo Nielsen, il 37% degli utenti dei social network accede ad essi tramite mobile.

SoLoMo

SoLoMo

Si è passati dal Social Media 1.0, caratterizzato dall’utilizzo del pc per connettersi alle piattaforme sociali, al Social Media 2.0, il nuovo paradigma che si basa sulle smartphone-application e sulle mobile-web interface. Ai primordi, la localizzazione, ossia capire il luogo in cui si trovava l’utente (physical location), non aveva senso, visto che ci si connetteva da casa o in ufficio. Con la mobilità, le informazioni di geolocalizzazione sono diventate di stupefacente rilevanza e si è arrivati ad esasperare il paradigma di mobilità stesso: anche quando gli utenti sono offline dalla rete, in realtà sono connessi. Infatti, le loro informazioni vengono sincronizzate non appena le app sui loro smartphone si connettono alla rete, arricchendo la “matrice territoriale” (matrix territory), che geolocalizza gli utenti sulla mappa sociale.

ll punto chiave del fenomeno SoLoMo è il cosiddetto location-based engagement (LBE), ossia una sorta di “ingaggio” di un cliente da parte di una azienda o brand (chiamiamola marketer) e che si viene a creare quando, ad esempio, si utilizza una app di quest’ultima e si inizia con essa a condividere tutta una serie di informazioni, tra cui la propria posizione geografica, contestualizzata in un dato ambiente.
Gli attori tecnologici di questo “ingaggio” sono le piattaforme di LBE, le applicazioni mobile e i contextual layer.

SoLoMo - Layer

Continua la lettura