Presentazione di AsyncDisplayKit: Per app fluide e reattive su iOS-Facebook Engineering

Hai mai notato che le app balbettano mentre scorri e scorri? Toccato un pulsante e guardato l’intera interfaccia congelare come si cerca di reagire? iOS è ben noto per la sua barra di qualità dell’esperienza utente, ma incontrare quella barra può essere difficile, specialmente su iPhone e iPad più vecchi. Le app lucidate utilizzano in genere ottimizzazioni delle prestazioni frammentarie per mantenere fluide le loro interfacce, trattando diverse fonti di lentezza come problemi diversi. Oggi stiamo open-sourcing AsyncDisplayKit, un framework che offre un modo olistico per mantenere la tua app fluida e reattiva.

Il caso di AsyncDisplayKit

Funzionalità dell’interfaccia utente iOS — disegnare sullo schermo, rispondere agli eventi tattili, eseguire simulazioni di fisica per lo scorrimento inerziale e così via — è strozzato dal thread principale. Affinché un’app mantenga il gold standard di 60 fotogrammi al secondo, può utilizzare il thread principale solo per millisecondi alla volta. Ma le viste UIKit solo per thread principale come UIImageView e UITextView possono richiedere da decine a centinaia di millisecondi per dimensionare e visualizzare se stesse. E mentre il thread principale sta decodificando un’immagine o renderizzando il testo, non può rispondere all’input dell’utente o tenere il passo con lo scorrimento.

Poiché l’utilizzo delle viste UIKit di serie può causare rallentamenti, le app performanti tendono ad avere soluzioni alternative per i singoli componenti UIKit. Invece di lasciare che UIImageView faccia un lavoro costoso, potrebbe utilizzare manualmente la grafica principale per decomprimere JPEG e PNG in background; invece di usare UITextView, potrebbero funzionare direttamente con il testo principale. Questo approccio è efficace, ma ha dei limiti: le soluzioni alternative individuali tendono a comportarsi in modo diverso, rendendo difficile ragionare su miglioramenti di livello superiore e sul comportamento delle applicazioni.

AsyncDisplayKit si basa su Uikit e Core Animation per offrire una soluzione generale. Le sue viste di immagine e testo possono essere utilizzate senza bloccare il thread principale, offrendo una soluzione drop-in per questa attività comune. Ancora più importante, supporta in modo asincrono la creazione e il rendering di gerarchie di visualizzazione complesse allo stesso modo.

Introducendo il nodo

Il nodo AsyncDisplayKit è un’astrazione thread-safe su UIView, che è a sua volta un’astrazione su CALayer:

Se sai come usare le viste, sai come usare i nodi. ASImageNode e il kit di testo alimentato ASTextNode possono essere utilizzati proprio come le loro controparti UIKit. A differenza delle gerarchie di visualizzazione UIKit, le gerarchie dei nodi per intere schermate di contenuti possono essere inizializzate e disposte su thread in background e i nodi rendono facile sfruttare le CPU multicore in tutti i dispositivi iOS attuali.

I nodi hanno molti vantaggi rispetto alle viste. Ad esempio, è spesso possibile migliorare le prestazioni sostituendo le viste con i livelli. Sfortunatamente, farlo richiede il noioso processo di porting del codice basato sulla vista alle diverse API e rischia inevitabilmente regressioni. Con i nodi, è facile come:

Se in seguito è necessario passare dai livelli alle viste, è un cambiamento di una riga! Questa è una differenza di trasformazione. Invece di essere cauti con il codice UI supportato dai livelli, puoi usarlo per impostazione predefinita ogni volta che non hai bisogno di gestire il tocco.

Guida introduttiva

AsyncDisplayKit è robusto e pronto per l’uso nelle tue app. Originariamente l’abbiamo costruito per rendere possibile l’interfaccia utente altamente tattile di Paper, e va di pari passo con il motore di animazione Pop, ma è altrettanto potente con le dinamiche UIKit e i progetti di app convenzionali. Non vediamo l’ora di vedere cosa creerai con esso.

Controlla la guida o il NSLondon talk per saperne di più. AsyncDisplayKit è disponibile su GitHub.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.