Introductie van AsyncDisplayKit: voor soepele en responsieve apps op iOS-Facebook Engineering

heb je ooit gemerkt apps stotteren als je scroll en veeg rond? Tikte op een knop en zag de hele interface bevriezen als het probeert te reageren? iOS is bekend om zijn user experience quality bar, maar het ontmoeten van die bar kan moeilijk zijn, vooral op oudere iPhones en iPads. Gepolijste apps gebruiken meestal fragmentarische prestatieoptimalisaties om hun interfaces vloeiend te houden, waarbij verschillende bronnen van traagheid als verschillende problemen worden behandeld. Vandaag zijn we open-sourcing AsyncDisplayKit, een raamwerk dat een holistische manier biedt om uw app soepel en responsief te houden.

het geval voor AsyncDisplayKit

iOS — gebruikersinterfacefunctionaliteit — tekenen naar het scherm, reageren op aanraakgebeurtenissen, natuurkundige simulaties uitvoeren voor traagheidsschuiven, enzovoort-wordt door de hoofdthread geblokkeerd. Voor een app om de gouden standaard van 60 frames per seconde te handhaven, kan het alleen de hoofddraad gebruiken voor milliseconden per keer. Maar main-thread-only UIKit-weergaven zoals UIImageView en UITextView kunnen tientallen tot honderden milliseconden duren om zichzelf te vergroten en weer te geven. En terwijl de belangrijkste thread is het decoderen van een afbeelding of het renderen van tekst, kan het niet reageren op de invoer van de gebruiker of houden met scrollen.

omdat het gebruik van standaard UIKit-weergaven vertragingen kan veroorzaken, hebben performante apps meestal tijdelijke oplossingen voor individuele UIKit-componenten. In plaats van UIImageView zelf duur werk te laten doen, kunnen ze handmatig Core Graphics gebruiken om JPEG ‘s en PNG’ s op de achtergrond te decomprimeren; in plaats van UITextView te gebruiken, werken ze mogelijk direct met kerntekst. Deze aanpak is effectief, maar heeft beperkingen — individuele workarounds hebben de neiging om zich anders te gedragen, waardoor het moeilijk is om te redeneren over verbeteringen op een hoger niveau en applicatiegedrag.

AsyncDisplayKit bouwt voort op UIKit en Core animatie om een algemene oplossing te bieden. De beeld-en tekstweergaven kunnen worden gebruikt zonder het blokkeren van de belangrijkste thread, het aanbieden van een drop-in oplossing voor deze gemeenschappelijke taak. Nog belangrijker, het ondersteunt asynchroon maken en renderen van complexe weergave hiërarchieën op dezelfde manier.

de node

De asyncdisplaykit node is een thread-veilige abstractie over UIView, wat op zijn beurt een abstractie over CALayer is:

Als u weet hoe u weergaven moet gebruiken, weet u hoe u knopen moet gebruiken. ASImageNode en de tekst Kit-aangedreven ASTextNode kunnen worden gebruikt Net als hun UIKit tegenhangers. In tegenstelling tot UIKit view hiërarchieën, node hiërarchieën voor hele screenfuls van inhoud kan worden geïnitialiseerd en aangelegd op de achtergrond threads — en knooppunten maken het gemakkelijk om te profiteren van de multicore CPU ‘ s in alle huidige iOS-apparaten.

knopen hebben veel voordelen ten opzichte van weergaven. U kunt bijvoorbeeld vaak prestaties verbeteren door weergaven te vervangen door lagen. Helaas, dit vereist het vervelende proces van het porten van view-based code naar de verschillende API en onvermijdelijk risico ‘ s regressies. Met knooppunten is het net zo eenvoudig als:

Als u later van lagen terug naar weergaven moet wisselen, is het een verandering van één regel! Dit is een transformationeel verschil. In plaats van voorzichtig te zijn met layer-backed UI-code, kunt u deze standaard gebruiken wanneer u geen touch handling nodig hebt.

aan de slag

AsyncDisplayKit is robuust en klaar voor gebruik in uw apps. We hebben het oorspronkelijk gebouwd om de zeer tactiele gebruikersinterface van papier mogelijk te maken, en het gaat hand in hand met de popanimatie-engine, maar het is net zo krachtig met UIKit-dynamiek en conventionele app-ontwerpen. We kunnen niet wachten om te zien wat je ermee gaat maken.

bekijk de gids of de nslondon talk voor meer informatie. AsyncDisplayKit is beschikbaar op GitHub.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.