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

dette er fortsættelsen af samtidigheden i hurtige serier. Se Del1 og del 2 for at forstå det grundlæggende

i denne del dækker vi følgende emner

  1. Hvad er operationer og det er Livstilstande
  2. Opret blok, NSInvocationOperation og brugerdefinerede operationer til at køre opgaver async
  3. Sådan annulleres operationer
  4. Hvad er Operationskøer
  5. Sådan tilføjes operationer i operationskøer
  6. Sådan oprettes afhængigheder mellem operationer
  7. fordele ved operationskøer over GCD
  8. implementering af dispatchgruppe ved hjælp af operationskøer

operationer er en objektorienteret måde at indkapsle arbejde, som du vil udføre asynkront. Operationer er designet til at blive brugt enten sammen med en operationskø eller af sig selv

et operationobjekt er en forekomst af klassen Operation or NSOperation (i Fundamentrammen), som du bruger til at indkapsle arbejde, du vil have din applikation til at udføre.

selve Operationsklassen er en abstrakt basisklasse, der skal underklasses for at udføre ethvert nyttigt arbejde. På trods af at være abstrakt, giver denne klasse en betydelig mængde infrastruktur for at minimere mængden af arbejde, du skal gøre i dine egne underklasser. Derudover indeholder Fundamentrammen to konkrete underklasser, som du kan bruge som den er med din eksisterende kode.

Operations State

en operation har en tilstandsmaskine, der repræsenterer dens livscyklus. Der er flere mulige tilstande, der forekommer i forskellige dele af denne livscyklus:

  • når det har været instantiated, vil det overgå til isReady staten.
  • når vi påberåbte start – metoden, overgår den til isExecuting – tilstanden.
  • når opgaven finished , flytter den til isFinished
  • når opgaven er i gang , og du ringer til cancel, så overgår den til isCancelled tilstand, før den går videre til isFinished tilstand

der er hovedsageligt tre måder at oprette operationer på

BlockOperation (betonklasse)

en klasse, du bruger som-er til at udføre en eller flere blokobjekter samtidigt. Fordi det kan udføre mere end en blok, fungerer et blokoperationsobjekt ved hjælp af en gruppesemantisk; først når alle de tilknyttede blokke er færdige med at udføre, betragtes selve operationen som færdig.. I block operation kan du drage fordel af drift afhængigheder, KVO, meddelelser og annullering .

som vist i Figur 1 udførte vi denne kode asynchvilket betyder, at den vil vende tilbage med det samme, men den dårlige nyhed er, at den vil blokere hovedtråden siden operation.start() blev kaldt på hovedtråden

Operation objekter udføres som standard på en synkron måde — det vil sige, de udfører deres opgave i tråden, der kalder deres start metode.

Figur 1

hvad dælen er synkron måde og udføre en eller flere blok objekter samtidigt.

som vist i figur 1.0.1 som du kan se de opgaver / blokke, der er tilføjet til selve Blokoperationen, udført samtidigt, men blokkørslen synkron måde betyder, at den blokerede tråden, hvor start kaldes i vores tilfælde er det hovedtråd

figur 1.0.1

som vist i figur figur 1.0.2, da vi kalder start metode på anden tråd, vil det blokere denne tråd

figur 1.0.2

som vist i figur figur 1.0.3, kan vi også tilføje færdiggørelsesblok, som vil ringe, når alle samtidige blokke udføres

figur 1.0.3

Kør Blokoperation samtidigt

som vist i Figur 1.1 Da vi kalder start() metode på en baggrund tråd det vil udføre deres opgave i tråden. Der er en cool måde at gøre dette ved hjælp af operation kø, og vi vil se dette senere.

figur 1.1

NSInvocationOperation (beton klasse)

en klasse, du bruger as-is til at oprette et operationsobjekt baseret på et objekt og en vælger fra din applikation.

i mål C kan vi oprette NSInvocationOperation, mens den ikke er tilgængelig i hurtig.

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

3. Brugerdefinerede operationer

underklasse Operation giver dig fuld kontrol over implementeringen af dine egne operationer, herunder muligheden for at ændre standardmåden, som din operation udfører og rapporterer dens status på.

som vist i figur 2 oprettede vi brugerdefinerede operationer ved underklasse det fra Operation basisklasse og tilsidesætter dens main metode. Når du underklasse du sætter din opgave på main metode. Vi implementerede ikke-samtidig brugerdefineret drift, og i dette tilfælde blokerede vi hovedtråden

figur 2

hvis du planlægger at udføre operationer manuelt og stadig vil have dem til at køre asynkront, skal du tage de nødvendige handlinger for at sikre, at de gør det. Du gør dette ved at definere dit operationsobjekt som en samtidig handling.

som vist i figur 3 udførte vi følgende trin for at udføre opgaven samtidigt

  1. oprettet underklasse MyConcurrentQueue. Stavefejl: Navnet skal være MyConcurrentOperations
  2. opkald start() metode vil ringe main() metode på baggrundstråd
  3. på hovedmetoden definerede vi vores opgave og en ting at bemærke, at vi også imødekommer Annuller sag
  4. ved opkald cancel ved brugerdefineret drift overgår til isCancelled tilstand og bryde løkken, og som vist i figur 3 udskriver den kun 39487 varer

figur 3

Operationskøer

  1. Operationskøer er kakaos abstraktion på højt niveau på GCD
  2. brug af Operation køer du vil se den reelle magt operationer, i stedet for at starte operationen selv, du giver det til operationen kø det derefter håndtere planlægning og udførelse.
  3. Operationskøer er en objektorienteret måde at indkapsle arbejde, som du vil udføre asynkront.
  4. du tilføjer operations (opgaver/arbejde) på operation queue, og vi diskuterede, hvordan vi kan oprette operationer ved hjælp af to metoder.

Tilføj operationer

som vist i figur 4 oprettede vi to operationer (ved hjælp af blok) og tilføjede dem i driftskø. Operation kø startede både operation på nogle baggrund tråd og henrettet dem. Ingen grund til at ringe start() metode på brugerdefineret trådkrus. Når vi tilføjer operation til operationskøen, kører den, så snart den er klar

figur 4

som vist i figur 5 Vi har lige udført opgaven serielt, eller du kan sige, at vi implementerede seriekø ved hjælp af Operationskøer, se venligst min del 1 hvis du ikke ved, hvad der er seriekø ved at indstille maxConcurrentOperationCount = 1

maxConcurrentOperationCount →det maksimale antal operationer i kø, der kan udføres på samme tid. Standardværdien er -1, hvilket betyder, at systemet bestemmer

figur 5

ved at indstille maxConcurrentOperationCount = 2 lavede vi en samtidig kø, og nu udføres opgaver samtidigt som vist i figur 6

figur 6

Operationsafhængigheder

som vist i Figur 7 oprettede vi igen en seriekø ved at tilføje afhængigheder mellem to opgaver. Vi oprettede to blokoperationer, og vi siger, at du ikke starter opgave 1, Før opgave 2 er færdig ved at ringe blockOperations1.addDependency(blockOperations2)

Figur 7

implementering af Dispatchgruppe ved hjælp af Operationskø

i del 2 brugte vi GCD dispatch group-funktionen til at blokere en tråd, indtil en eller flere opgaver var færdige med at udføre. Som vist i figur 8 implementerede vi den samme adfærd ved hjælp af Driftskøer ved hjælp af afhængigheder. Dette er meget nyttigt, hvis du ikke kan gøre fremskridt, før alle de angivne opgaver er afsluttet.

som vist i figur 8 har vi tre opgaver, og vi ønskede at køre samtidigt, og når alle opgaverne er færdige, skal vi ringe til en metode for at indikere, at alle opgaver er færdige, og hvad vi gjorde

  1. oprettet en operationskø
  2. oprettet tre blokoperationer, der udfører opgaver
  3. oprettet en færdiggørelsesblokoperation (blockOperations4), som udløses, når alle tre opgaver afsluttes
  4. made blockOperations4 afhængig af blockOperations1, blockOperations2 og blockOperations3 hvilket betyder blockoperations4 vil udføre, når alle tre opgaver vil færdig
  5. waitUntilFinished → Blokerer udførelse af den aktuelle tråd, indtil operationobjektet afslutter sin opgave, da vi ikke ønsker at blokere den aktuelle tråd, som er den vigtigste, tildeler vi den med falsk
  6. Kør denne kode, og “Al Operation er afsluttet” udskrives, når task1, task2 og task3 afsluttes

figur 8

som vist i figur 9 blokerer vi bare hovedtråden ved at indstille waitUntilFinished = true. så spørgsmålet er, hvornår det er nyttigt, og du får svaret i næste afsnit

figur 9

som vist i Figur 10 implementerede vi en forsendelsesgruppeadfærd ved hjælp af operationskø uden at bruge nogen afhængigheder hvad vi gjorde vi brugte waitUntilFinished funktion korrekt . Hvis du er på baggrundstråd, kan du blokere denne tråd for at opnå denne adfærd. Jeg skiftede med vilje til baggrundstråd ved hjælp af DispatchQueue.global().async metode se del 1 For at forstå denne kode

vi fortalte operationskø Kør opgave 1, Opgave 2 og Opgave 3 på operationskø og bloker den aktuelle tråd, indtil disse samtidige opgaver afslutter deres udførelse

Figur 10

fordele ved Operation køer over GCD

  1. Operation API giver støtte til afhængigheder. Du kan oprette komplekse afhængigheder mellem opgaver meget nemt, men i GCD kan du opnå det, men du skal gøre en masse arbejde.
  2. nsoperation og Nsoperationkø klasser har en række egenskaber, der kan observeres ved hjælp af KVO (Nøgleværdiobservation). Dette er en anden vigtig fordel, hvis du vil overvåge tilstanden af en operation eller operationskø.
  3. operationer kan sættes på pause, genoptages og annulleres. Når du sender en opgave ved hjælp af Grand Central Dispatch, har du ikke længere kontrol eller indsigt i udførelsen af den opgave. NSOPERATION API er mere fleksibel i den henseende, hvilket giver udvikleren kontrol over operationens livscyklus
  4. Nsoperationskøen tilføjer også en række fordele til blandingen. Du kan f.eks. angive det maksimale antal operationer i kø, der kan køre samtidigt. Dette gør det nemt at kontrollere, hvor mange operationer der kører på samme tid eller oprette en seriel operationskø.

kommende

i næste del vil vi se på den faktiske brugssag for oprettelse af brugerdefineret operation

nyttige Links

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.