Udforske designmønstre brugt af Apple på iOS

Designmønstre er en vigtig del af softwaredesign, de giver en løsning på ofte forekommende problemer.
Apple bruger disse mønstre over alle iOS-rammer. I denne artikel vil vi diskutere, hvordan designmønstre bruges i de interne Apple API'er, og hvordan du kan drage fordel af disse implementeringer.

Vi bruger iOS-rammer som UIKit CoreLocation CoreBluetooth og mange andre i vores daglige udvikling. Komponenter som UITableView UIStackView er alle skrevet med et fantastisk genbrugeligt design fra apple.

Der er mange designmønstre, som æble brugt gennem udviklingen af ​​deres sæt. Lad os prøve at udforske nogle af disse mønstre og se, hvordan vi kunne implementere dem.

Objektpool

Objektpuljen er et mønster, der genbruger et sæt initialiserede objekter.

Når en klient i poolen anmoder om et objekt, returnerer en pulje en faktisk vare, der er klar til at blive genbrugt snarere end at oprette en ny instans. Når klienten er færdig med at bruge objektet, returnerer den objektet til puljen, så det kan genbruges på et senere tidspunkt.

Objektpooler bruges til ydeevne, da objekter, der er hentet fra og returneres til en pool, faktisk ikke oprettes eller ødelægges på dette tidspunkt. Derfor sparer du masser af ydelse.

UITableView kan give os en fantastisk måde at forstå brugen og implementeringen af ​​objektpoolmønster på.

Den måde, UITableView fungerer på, er at den tager cellerne, der skubbes væk fra skærmen og derefter genbruger dem til de kommende celler.

Hurtig implementering af objektpool

Lad os prøve at levere en objektpoolimplementering til iOS.

For det første er vi nødt til at oprette en protokol, som vi kan bruge til at begrænse vores generiske poolelementer. Da vi vil levere genanvendelige celler til en tabelvisning, lad os navngive det Genanvendelig

Vi kan føje PreparForReuse til protokollen og kalde det, når elementet genbruges fra poolen for at give den nødvendige oprydning for objektet, før det vises igen på skærmen.

En UITableViewCell ville derefter blot være en UIView, der er i overensstemmelse med Genanvendelig

Lad os begynde at implementere vores Objekt, der er ansvarligt for samlingen, som følgende:

Vores Object Pool Class har brug for en fabriksfunktion, der ved, hvordan man opretter en ny generisk vare.

Vi har brug for maxElementCount-variabel, som tabelvisning bruger til at give det maksimale antal celler, der vises på skærmen på samme tid. Da iOS allerede har en delegeret for antallet af poster i et afsnit sammen med heightForRowInSection, vil denne værdi være let.

I objektpuljen har vi brug for to metoder, den ene er at tegne et emne og en for at frigive objektet, der skal genanvendes. I eksemplet med tabelvisning frigiver vi celleobjektet, når cellen ville gå offscreen.

Lad os bruge en simpel matrix, der indeholder de aktuelt frigivne elementer og enten genbruge dem, når de er tilgængelige, eller oprette nye med vores fabriksfunktion.

Når funktionen dequeueReusableCell ville blive kaldt, så ville UITableView blot trække et objekt fra dets pool.

Da UITableView simpelthen er en underklasse af UIScrollView, kunne vi let vide, hvornår en celle er offscreen, derfor kan vi simpelthen frigive celleobjektet til den genanvendelige pool.

Nedenfor er den funktion, der bliver kaldt op, når cellen går af skærmen.

Singleton mønster

Singleton-mønsteret er et mønster, der bruges til at oprette kun én forekomst af et bestemt objekt. Alle yderligere henvisninger til objektets henvisning til den samme underliggende forekomst. Singletoner bruges, når det giver mening for et enkelt objekt at give adgang til en global ressource.

Et singleton-objekt kan simpelthen oprettes i hurtig som følgende

Hurtig implementering af Singleton

Apple bruger singletons i mange tilfælde nogle af dem er NSFileManager, NSA-applikation og inUIA-applikation.

Når en klient beder objektet om en instans, får den en delt instans. Dette objekt oprettes doven ved den første anmodning.

Vi kan bruge Singletons i vores kode for at undgå at tildele flere forekomster af en instans, hvilket sparer ydeevne. Vi skal dog være opmærksomme på, at singletons kan forårsage problemer i nogle tilfælde og bør bruges omhyggeligt og ikke være for meget.

  • Brug Singleton klasser til situationer, hvor det giver mening for et enkelt objekt at give adgang til en global ressource.
  • Glem ikke, at Singleton-klasser ikke kan underklasseres.
  • Singletons kan skjule afhængigheder, generelt bør vi sigte mod softwarearkitektur, der har minimal afhængighed mellem klasser.

Observatørmønster

Observatormønsteret bruges til at offentliggøre ændringer i objekttilstand. Andre objekter kan abonnere og blive underrettet om ændringerne.

Interaktion kan finde sted mellem genstande uden at de behøver at vide om hinanden, dette gør subjekt og observatører løst koblet.

Hvordan bruger Apple observatørmønster?

underretninger

Apple bruger Observer-mønster på NSNotificationCenter Objekter udsender underretningerne til NSNotificationCenter ved at identificere underretningen med en global streng. Observer Object kan lytte til denne anmeldelse og få ændret objektet. Indsendelse af en anmeldelse sker på en synkron måde.

Vi kan bruge inNSNotificationCenter vores kode til at abonnere på systemunderretninger eller offentliggøre og abonnere på brugerdefinerede underretninger.

NSNotificationCenter er virkelig rart, men lad os prøve at skrive en brugerdefineret implementering til observatørmønster i Swift, så vi har en dybere forståelse af dette mønster.

Hurtig implementering af observatørmønster

Anvendelse

Afslutningsvis

Apple bruger stor brug af designmønstre i iOS i alle deres API'er. I denne artikel har vi undersøgt, hvordan de implementerede disse mønstre, og vi leverede implementering ved hjælp af hurtige til Object Pool, Singleton og Observer Patterns.

At forstå designmønstre er virkelig vigtigt for enhver udvikler, der søger ren kode og arkitektur. Hvis du vil vide mere om designmønstre, og hvordan de let kan implementeres på iOS, skal du kontrollere denne artikel, der forenkler implementeringen i Swift.

Jeg håber, at du nød dette indlæg, og at dette bliver nyttigt for din kodebase.

Sørg for at klappe og dele det for at vise din støtte.

Hvis du har spørgsmål eller kommentarer, er du velkommen til at lægge en note her eller maile mig til arlindaliu.dev@gmail.com.