
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
- Hvad er operationer og det er Livstilstande
- Opret blok, NSInvocationOperation og brugerdefinerede operationer til at køre opgaver async
- Sådan annulleres operationer
- Hvad er Operationskøer
- Sådan tilføjes operationer i operationskøer
- Sådan oprettes afhængigheder mellem operationer
- fordele ved operationskøer over GCD
- 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å tilisReady
staten. - når vi påberåbte
start
– metoden, overgår den tilisExecuting
– tilstanden. - når opgaven
finished
, flytter den tilisFinished
- når opgaven er i gang , og du ringer til
cancel
, så overgår den tilisCancelled
tilstand, før den går videre tilisFinished
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 async
hvilket 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.

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

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

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

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.

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.

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

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
- oprettet underklasse
MyConcurrentQueue
. Stavefejl: Navnet skal væreMyConcurrentOperations
- opkald
start()
metode vil ringemain()
metode på baggrundstråd - på hovedmetoden definerede vi vores opgave og en ting at bemærke, at vi også imødekommer Annuller sag
- ved opkald
cancel
ved brugerdefineret drift overgår tilisCancelled
tilstand og bryde løkken, og som vist i figur 3 udskriver den kun 39487 varer

Operationskøer
- Operationskøer er kakaos abstraktion på højt niveau på GCD
- 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.
- Operationskøer er en objektorienteret måde at indkapsle arbejde, som du vil udføre asynkront.
- 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

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

ved at indstille maxConcurrentOperationCount
= 2 lavede vi en samtidig kø, og nu udføres opgaver samtidigt som vist i 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)

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
- oprettet en operationskø
- oprettet tre blokoperationer, der udfører opgaver
- oprettet en færdiggørelsesblokoperation (blockOperations4), som udløses, når alle tre opgaver afsluttes
- made
blockOperations4
afhængig afblockOperations1
,blockOperations2
ogblockOperations3
hvilket betyder blockoperations4 vil udføre, når alle tre opgaver vil færdig -
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 - Kør denne kode, og “Al Operation er afsluttet” udskrives, når task1, task2 og task3 afsluttes

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

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

fordele ved Operation køer over GCD
- 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.
- 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ø.
- 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
- 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