Selv om iPhone 5 og iPad 4 leveres med en kraftig A6 (X) prosessor og mye mer RAM enn den opprinnelige iPhone, betyr dette ikke at iOS-applikasjoner per definisjon er raske og effektive. I dette raske tipset vil jeg gi deg fem tips for å forbedre applikasjonsytelsen.
Hvis et iOS-program henter en ekstern ressurs, er det viktig at den ikke henter de samme ressursene hver gang den trenger tilgang til den. Hvis du for eksempel planlegger å utvikle en Twitter-klient for iOS, må klienten ikke laste ned samme avatar hver gang den trenger å vise den. Caching av avataren vil forbedre programytelsen betydelig.
Hva er caching? Den grunnleggende ideen om caching er enkel. Når programmet henter en ekstern ressurs for første gang, lagrer den en kopi av ressursen på disken for senere bruk. Hvis den samme ressursen er nødvendig senere, kan programmet laste den fra disk i stedet for å hente den eksternt. Den ekstra fordelen er at ressursen også er tilgjengelig når enheten ikke er koblet til nettet. Det komplekse aspektet ved caching er hvordan du lagrer ressursen, når du skal lagre den, og viktigst når du skal oppdatere den.
Olivier Poitrey har utviklet et lite bibliotek som heter SDWebImage som tar sikte på å cache bilder. Det gir en kategori på UIImageView
mye som AFNetworking gjør. Hovedforskjellen er det SDWebImage cacher bildene den laster ned. Bilder lastes ned i bakgrunnen, og hvert bilde dekomprimeres, noe som resulterer i raskere belastningstider. Biblioteket bruker Grand Central Dispatch for å holde hovedgruppen lydhør. Hvis søknaden din fungerer med fjernbilder, bør du se på denne perlen.
En av de viktigste leksjonene å lære når du utvikler for iOS-plattformen er å aldri blokkere hovedtråden. Hvis du blokkerer hovedtråden med lang drift, for eksempel nedlasting av bilder eller andre ressurser, blir søknaden din ikke reagerende så lenge operasjonen ikke er fullført. Gjør det til en vane å flytte lange løpende oppgaver til en bakgrunnstråd. Selv om du bare trenger en håndfull byte, hvis enhetens tilkobling til nettet er sakte, vil operasjonen fortsatt blokkere hovedtråden.
Å skrive sikker multithreaded kode har blitt mye lettere med introduksjonen av Grand Central Dispatch. Ta en titt på følgende kodestykker. Den første bunten laster ned data på hovedtråden, mens den andre brikken bruker Grand Central Dispatch til å utføre den samme oppgaven på en bakgrunnskø.
NSData * data = [NSData dataWithContentsOfURL: URL]; UIImage * image = [UIImage imageWithData: data]; [imageView setImage: image];
dispatch_queue_t queue = dispatch_queue_create ("downloadAsset", NULL); dispatch_async (kø, ^ NSData * data = [NSData dataWithContentsOfURL: URL]; dispatch_async (dispatch_get_main_queue (), ^ UIImage * image = [Ullmage imageWithData: data]; [imageView setImage: image];););
Å være lat er ikke alltid dårlig, spesielt hvis du er programmerer. Lazy loading er et godt kjent konsept innen programvareutvikling. Det betyr bare at du utsetter instantieringen av en gjenstand til du trenger objektet. Dette er fordelaktig av flere grunner. Avhengig av objektet og kostnaden for instantiering, kan det dramatisk forbedre applikasjonsytelsen og minnebruk. Lazy loading objects er ikke et vanskelig konsept. Den enkleste gjennomføringen av dette mønsteret overstyrer getteren til en eiendom som vist nedenfor.
- (MyClass *) myObject if (! _MyObject) _myObject = [[MyClass alloc] init]; returner _myObject;
Det dovne lastemønsteret kan brukes på mange områder av programvareutvikling. Hvis for eksempel en del av søknadens brukergrensesnitt ikke er vist som standard, kan det være en fordel å utsette sin instantiering til den delen skal vises.
Tabell- og samlingsvisninger bruker en kombinasjon av caching og lat lasting for å optimalisere ytelsen. Hvis den neste cellen eller elementet skal vises på skjermen, ser tabell- eller samlingsvisningen for en celle eller en gjenstand som den kan gjenbruke (caching). Bare hvis ingen gjenbrukbar celle eller gjenstand er tilgjengelig, vil tabell- eller samlingsvisningen (eller datakilden) finne en ny celle eller en gjenstand (lat lasting).
Hvis du oppdager at søknaden din er treg til tider, og du vil finne ut hva som forårsaker det, må du kanskje profilere programmet med et verktøy som Instrumenter. Colin Ruffenach skrev en fin opplæring om tidsprofilering med Instruments on Mobiletuts+.
Hvis Instrumenter ikke gir deg et klart svar, kan du være interessert i MGBenchmark, et referansebibliotek utviklet og vedlikeholdt av Mattes Groeger. Dette kompakte biblioteket lar deg måle hvor fort koden din kjøres, og det hjelper deg med å spore flaskehalsene i koden din. Det supplerer faktisk Instrumenter ganske bra, så du bør ikke bruke den ene eller den andre. Mattes Groegers bibliotek kommer med et omfattende sett og er bemerkelsesverdig kraftig. Jeg anbefaler det som et alternativ eller et supplement til Instruments.
Hvis du utvikler et program som fungerer med mye data, så er det viktig å teste det med ... vel ... masse data! Under utviklingen av en søknad er det ikke alltid lett eller mulig å forestille seg hvordan brukerne skal bruke søknaden din, men det er godt å sette det gjennom sine skritt før de slippes ut. Din søknad kan utføre beundringsverdig under utvikling og utføre fryktelig i situasjoner der det oversvømmes med data. Du vil sannsynligvis ikke kunne forutsi, enda mindre teste, alle omstendighetene der søknaden din skal brukes, men du kan prøve å etterligne vanlige situasjoner ved å lage datasett for å teste med.
Jeg lager ofte et lite skript eller en klasse som fyller applikasjonen med testdata for å måle hvor godt den utfører med mye data. Ideelt sett vil du fylle applikasjonen med flere testdata enn en gjennomsnittlig bruker vil ha - i den grad du kan forutsi dette under utviklingen. Da jeg utviklet Pixelsync, et iPad-program som grensesnitt til Aperture og iPhoto, opprettet jeg et Aperture-bibliotek med nær 500.000 bilder. Hvis Pixelsync gjorde det bra med et fotobibliotek av den størrelsen, kunne jeg være ganske sikker på at den gjennomsnittlige brukeren ikke ville gå inn i ytelsesproblemer.
Hvis du virkelig er en lat utvikler eller du ikke har nok tid, så kan du også være mer kreativ ved å bygge en robot for å gjøre jobben for deg.
Applikasjonsytelsen er fortsatt et viktig aspekt av programvareutvikling til tross for at den nye generasjonen av enheter er mye kraftigere og mer kapabel. Blokkering av hovedtråden, for eksempel, vil alltid resultere i en dårlig brukeropplevelse, uansett hvorvidt enheten er i stand.