https://www.raywenderlich.com/5370-grand-central-dispatch-tutorial-for-swift-4-part-1-2

Dette er fortsettelsen av samtidigheten i swift-serien. Se part1 og del 2 for å forstå det grunnleggende

i denne delen vil vi dekke følgende emner

  1. Hva Er Operations and It ‘ S Life states
  2. Opprett Blokk, NSInvocationOperation Og Egendefinerte Operasjoner for å kjøre oppgaver async
  3. hvordan avbryte operasjoner
  4. Hva Er Operasjonskøer
  5. Hvordan slik legger du til operasjoner i operasjonskøer
  6. slik oppretter du avhengigheter mellom operasjoner
  7. fordeler med operasjonskøer over gcd
  8. Implementering Av Forsendelsesgruppe ved hjelp av operasjonskøer

Operasjoner er en objektorientert måte å kapsle arbeid som du vil utføre asynkront. Operasjoner er utformet for å brukes enten sammen med en operasjonskø eller av seg selv

et operasjonsobjekt er en forekomst av klassen Operation or NSOperation (I Foundation framework) som du bruker til å kapsle arbeidet du vil at programmet skal utføre.

Operasjonsklassen i seg selv er en abstrakt grunnklasse som må underklasse for å kunne gjøre noe nyttig arbeid. Til tross for å være abstrakt, gir denne klassen en betydelig mengde infrastruktur for å minimere mengden arbeid du må gjøre i dine egne underklasser. I Tillegg Gir Foundation framework to konkrete underklasser som du kan bruke som-er med din eksisterende kode.

Driftsstatus

en operasjon har en tilstandsmaskin som representerer livssyklusen. Det er flere mulige tilstander som oppstår på ulike deler av denne livssyklusen:

  • når det har vært instantiated, vil det gå over til isReady – staten.
  • når vi påberopte start – metoden, vil den overgå til isExecuting – tilstanden.
  • når oppgaven finished flyttes den til isFinished
  • når oppgaven pågår Og du ringer cancel, vil den gå over til isCancelled – tilstanden før den går over tilisFinished – tilstanden

det er hovedsakelig tre måter å opprette operasjoner

Blokkoperasjon (Betongklasse)

en klasse du bruker som-er for å utføre ett eller flere blokkobjekter samtidig. Fordi det kan utføre mer enn en blokk, opererer et blokkoperasjonsobjekt ved hjelp av en gruppe semantisk; først når alle de tilknyttede blokkene er ferdig med å utføre, anses selve operasjonen som ferdig.. I blokkoperasjon kan du dra nytte av driftsavhengigheter, KVO, varsler og kansellering .

som vist I Figur 1 utførte vi denne koden asyncsom betyr at den vil returnere umiddelbart, men den dårlige nyheten er at den vil blokkere hovedtråden siden operation.start() ble kalt på hovedtråden

Operasjonsobjekter utføres på en synkron måte som standard — det vil si at De utfører sin oppgave i tråden som kaller sin start – metode.

Figur 1

hva pokker er synkron måte og utføre en eller flere blokkobjekter samtidig.

som vist i Figur 1.0.1 som du kan se oppgavene / blokkene lagt Til Blokkoperasjonen selv utført samtidig, men blokken kjører synkron måte betyr at den blokkerte tråden der start kalles i vårt tilfelle er det hovedtråd

Figur 1.0.1

som vist I Figur Figur 1.0.2, siden vi kaller startmetode på annen tråd, vil den blokkere den tråden

Figur 1.0.2

Som vist I Figur Figur 1.0.3, kan vi også legge til fullføringsblokk som vil ringe når alle samtidige blokker vil utføres

Figur 1.0.3

Kjør Blokkoperasjon Samtidig

som vist I Figur 1.1 siden vi kaller start() metode på en bakgrunnstråd, vil den utføre oppgaven i tråden. Det er en kul måte å gjøre dette ved hjelp av operation queue, og vi vil se dette senere.

Figur 1.1

Nsinvokasjonoperasjon (Betongklasse)

en klasse du bruker som-er for å opprette et operasjonsobjekt basert på et objekt og velger fra programmet.

i mål C kan vi opprette NSInvocationOperation mens Den ikke er tilgjengelig I Swift.

https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW6

3. Tilpassede Operasjoner

Underklasse Operation gir deg full kontroll over gjennomføringen av dine egne operasjoner, inkludert muligheten til å endre standard måten operasjonen utfører og rapporterer sin status.

som vist I Figur 2 opprettet vi tilpassede operasjoner ved å underklasse den fra Operation grunnklasse og overstyre main – metoden. Når du underklasse du sette oppgaven på main metode. Vi implementerte ikke samtidig tilpasset drift og i dette tilfellet blokkerte vi hovedtråden

Figur 2

hvis du planlegger å utføre operasjoner manuelt og fortsatt vil at de skal kjøre asynkront, må du ta de nødvendige tiltakene for å sikre at de gjør det. Du gjør dette ved å definere operasjonsobjektet som en samtidig operasjon.

som vist i Figur 3 utførte vi følgende trinn for å utføre oppgaven samtidig

  1. Opprettet underklasse MyConcurrentQueue. Skrivefeil: Navnet skal være MyConcurrentOperations
  2. Ringer start() metoden vil ringe main() metode på bakgrunnstråd
  3. på hovedmetoden definerte vi vår oppgave og en ting å merke seg, vi imøtekommer også avbryt tilfelle
  4. ved å ringe cancel på tilpasset operasjon vil overgangen til isCancelled staten og bryte sløyfen og som vist i Figur 3 vil den bare skrive ut 39487 elementer

Figur 3

Operasjonskøer

  1. Operasjonskøer Er Cocoas abstraksjon på HØYT nivå på GCD
  2. Ved Hjelp Av Drift Køer du vil se den virkelige kraften i operasjoner, i stedet for å starte operasjonen selv, du gir den til operasjonen køen det deretter håndtere planlegging og gjennomføring.
  3. Operasjonskøer Er en objektorientert måte å kapsle arbeid som du vil utføre asynkront.
  4. du legger til operations (oppgaver/arbeid) på operation queue og vi diskuterte hvordan vi kan opprette operasjoner ved hjelp av to metoder.

Legg Til Operasjoner

som vist i Figur 4 opprettet vi to operasjoner (ved Hjelp Av Blokk) og la dem til i driftskø. Operasjon køen startet både drift på noen bakgrunn tråd og henrettet dem. Du trenger ikke å ringe start() metode på tilpasset tråd 🆒. Når vi legger til operasjon i operasjonskøen, kjører den så snart den er klar

Figur 4

som vist i Figur 5 vi bare utført oppgave serielt eller du kan si at vi implementert seriell kø Ved Hjelp Av Drift Køer kan du se min del 1 hvis du ikke vet hva som er seriell kø ved å sette maxConcurrentOperationCount = 1

maxConcurrentOperationCount →maksimalt antall operasjoner i kø som kan utføres samtidig. Standardverdien er -1 som betyr at systemet bestemmer

Figur 5

ved å sette maxConcurrentOperationCount = 2 gjorde vi en samtidig kø, og nå utføres oppgaver samtidig som vist I Figur 6

Figur 6

Driftsavhengigheter

som vist i Figur 7 opprettet vi igjen en seriekø ved å legge til avhengigheter mellom to oppgaver. Vi opprettet to blokkoperasjoner, og vi sier at ikke start oppgave 1 til oppgave 2 er ferdig ved å ringe blockOperations1.addDependency(blockOperations2)

Figur 7

Dispatch Group Implementering Ved Hjelp Av Operations Queue

i del 2 brukte VI GCD dispatch group-funksjonen til å blokkere en tråd til en eller flere oppgaver ble fullført. Som vist i Figur 8 implementerte vi samme oppførsel ved Hjelp Av Operasjonskøer ved hjelp av avhengigheter. Dette er svært nyttig hvis du ikke kan gjøre fremgang før alle de angitte oppgavene er fullført.

som vist i Figur 8 har vi tre oppgaver, og vi ønsket å kjøre samtidig, og når alle oppgavene er ferdig må vi ringe noen metode for å indikere at alle oppgavene er ferdig, og hva vi gjorde

  1. Opprettet en operasjon kø
  2. Opprettet tre blokkoperasjoner som skal utføre oppgaver
  3. Opprettet en fullføring blokk operasjon (blockOperations4) Som vil utløse når alle tre oppgavene vil ferdig
  4. laget blockOperations4 avhengig av blockOperations1, blockOperations2 og blockOperations3 som betyr blockoperations4 vil utføre når alle tre oppgavene er ferdige
  5. waitUntilFinished → Blokkerer kjøring av gjeldende tråd til operasjonsobjektet fullfører sin oppgave siden vi ikke vil blokkere gjeldende tråd som er hoved, tilordner vi den med falsk
  6. Kjør denne koden og «All Operasjon Er Fullført» vil skrive ut når task1, task2 og task3 er ferdig

Figur 8

som vist i Figur 9 blokkerer vi bare hovedtråden ved å sette waitUntilFinished = true. så spørsmålet er når det er nyttig, og du får svaret i neste avsnitt

Figur 9

Som vist I Figur 10 implementerte vi en forsendelsesgruppeadferd ved hjelp av operasjonskø uten å bruke noen avhengigheter hva vi gjorde vi brukte waitUntilFinished – funksjonen på riktig måte . Hvis du er på bakgrunnstråd, kan du blokkere denne tråden for å oppnå denne oppførselen. Jeg forsettlig byttet til bakgrunnstråd ved hjelp av DispatchQueue.global().async metode se del 1 for å forstå denne koden

vi fortalte operasjonskø kjør oppgave 1, oppgave 2 og oppgave 3 på operasjonskø og blokkere gjeldende tråd til disse samtidige oppgavene vil fullføre utførelsen

Figur 10

Fordeler Med Drift Køer OVER GCD

  1. Operasjonen API gir støtte for avhengigheter. Du kan lage komplekse avhengigheter mellom oppgaver veldig enkelt, men I GCD kan du oppnå DET, men du må gjøre mye arbeid.
  2. nsoperation-og NSOperationQueue-klassene har en rekke egenskaper som kan observeres ved HJELP AV KVO (Key Value Observing). Dette er en annen viktig fordel hvis du vil overvåke tilstanden til en operasjon eller operasjonskø.
  3. Operasjoner kan settes på pause, gjenopptas og avbrytes. Når du sender en oppgave ved Hjelp Av Grand Central Dispatch, har du ikke lenger kontroll eller innsikt i utførelsen av oppgaven. NSOPERATION API er mer fleksibelt i den forbindelse, og gir utvikleren kontroll over operasjonens livssyklus
  4. NSOperationQueue legger også til en rekke fordeler for blandingen. Du kan for eksempel angi maksimalt antall operasjoner i kø som kan kjøres samtidig. Dette gjør det enkelt å kontrollere hvor mange operasjoner som kjøres samtidig, eller for å opprette en seriell operasjonskø.

Kommende

i neste del vil vi se på den faktiske bruken av å lage tilpasset operasjon

Nyttige Lenker

· https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.