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

tämä on jatkoa concurrency in swift-sarjalle. KS. osa 1 ja osa 2 perusteiden ymmärtämiseksi

tässä osassa käsitellään seuraavia aiheita

  1. mikä on operaatiot ja sen elämäntilanne
  2. luo Block, NSInvocationOperation ja Custom Operations to run tasks async
  3. miten peruutetaan operaatiot
  4. mikä on Operaatiojonot
  5. kuinka lisätä operaatioita operaatiojonoissa
  6. Kuinka luoda riippuvuuksia operaatioiden välille
  7. operaatiojonojen hyödyt yli GCD
  8. lähettäjäryhmän toteutus operaatiojonoja käyttäen

toiminta on oliokeskeinen tapa kapseloida työtä, jonka haluat suorittaa asynkronisesti. Operaatiot on suunniteltu käytettäväksi joko yhdessä operaatiojonon kanssa tai itse

operaatioobjekti on Operation or NSOperation – luokan ilmentymä (Perustuskehyksessä), jota käytät kapseloidaksesi työtä, jonka haluat sovelluksesi suorittavan.

itse Operaatioluokka on abstrakti perusluokka, joka on aliluokiteltava, jotta voidaan tehdä mitään hyödyllistä työtä. Vaikka tämä luokka on abstrakti, se tarjoaa merkittävän määrän infrastruktuuria minimoidakseen työmäärän, joka sinun on tehtävä omissa alaluokissasi. Lisäksi Säätiökehys tarjoaa kaksi konkreettista alaluokkaa, joita voit käyttää sellaisenaan nykyisellä koodillasi.

Operaatiotila

operaatiossa on sen elinkaarta kuvaava valtiokoneisto. On olemassa useita mahdollisia tiloja, jotka esiintyvät eri puolilla tätä elinkaarta:

  • kun se on ollut instantiated, se siirtyy isReady tilaan.
  • kun vedottiin start – menetelmään, se siirtyy isExecuting – tilaan.
  • kun tehtävä finished , se siirtyy isFinished
  • kun tehtävä on kesken ja soitat cancel, niin se siirtyy isCancelled tilaan ennen siirtymistä isFinished tilaan

on olemassa lähinnä kolme tapaa luoda operaatioita

Lohkooperaatio (konkreettinen Luokka)

luokka, jota käytät nimellä -, on suorittaa yksi tai useampi lohko objekteja samanaikaisesti. Koska se voi suorittaa useamman kuin yhden lohkon, lohkooperaatioobjekti toimii ryhmän semanttisen; vasta kun kaikki siihen liittyvät lohkot ovat suorittaneet, itse operaatio katsotaan valmiiksi.. Lohkokäytössä voit hyödyntää toiminnan riippuvuuksia, KVO: ta, ilmoituksia ja peruutuksia .

kuten kuvassa 1 esitetään, suoritimme tämän koodin async, mikä tarkoittaa, että se palaa välittömästi, mutta huono uutinen on, että se estää pääkierteen, koska operation.start() kutsuttiin pääkierteeseen

toiminta — objektit suorittavat oletuksena synkronisesti-eli ne suorittavat tehtävänsä säikeessä, joka kutsuu start – metodiaan.

Kuva 1

mitä hittoa on synkroninen tavalla ja suorittaa yhden tai useamman lohkon esineitä samanaikaisesti.

kuten kuvassa 1.0.1 näkyy tehtävät/lohkot, jotka on lisätty itse Lohkooperaatioon samanaikaisesti, mutta lohkoajo synkronisella tavalla tarkoittaa, että se on estänyt säiettä, josta aloitusta kutsutaan meidän tapauksessamme se on pääkierre

Kuva 1.0.1

kuten kuvassa kuvassa 1.0.2, koska kutsumme start menetelmä muiden säiettä, se estää, että säiettä

Kuva 1.0.2

kuten kuvassa 1.0.3, voimme lisätä loppuun lohko sekä joka soittaa, kun kaikki samanaikaiset lohkot suoritetaan

Kuva 1.0.3

Suorita Lohkooperaatio samanaikaisesti

Kuvan 1 mukaisesti.1 koska kutsumme start() menetelmää taustalangalla, se suorittaa tehtävänsä säkeessä. On viileä tapa tehdä tämä käyttämällä operaatio jono ja näemme tämän myöhemmin.

Kuva 1.1

NSInvocationOperation (betoniluokka)

luokka, jota käytät nimellä -, on luoda käyttöobjekti sovelluksen objektin ja valitsimen perusteella.

objective C: ssä voimme luoda NSInvocationOperation, kun se ei ole saatavilla Swiftissä.

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

3. Custom Operations

Aliluokitus Operation antaa sinulle täydellisen kontrollin omien operaatioidesi toteuttamiseen, mukaan lukien mahdollisuuden muuttaa oletustapaasi, jolla operaatiosi suorittaa ja raportoi sen tilan.

kuten kuvassa 2 on esitetty, loimme mukautettuja operaatioita alaluokalla it Operation perusluokasta ja ohitimme sen main – menetelmän. Kun aliluokitat, asetat tehtävän main – menetelmälle. Toteutimme ei-samanaikaisen mukautetun toiminnan ja tässä tapauksessa estimme pääkierteen

kuva 2

jos aiot suorittaa operaatioita manuaalisesti ja haluat niiden silti toimivan asynkronisesti, sinun on toteutettava tarvittavat toimenpiteet sen varmistamiseksi, että ne toimivat. Teet tämän määrittelemällä toiminta-objektisi samanaikaiseksi toiminnoksi.

kuten kuvassa 3 on esitetty, suoritimme seuraavat vaiheet tehtävän suorittamiseksi samanaikaisesti

  1. luotu alaluokka MyConcurrentQueue . Kirjoitusvirhe: Nimen tulisi olla MyConcurrentOperations
  2. kutsuminen start() menetelmä kutsuu main() menetelmä taustalangalla
  3. päämenetelmällä määrittelimme tehtävämme ja yksi asia huomioitava, että palvelemme myös peruutustapausta
  4. soitettaessa cancel muokatussa toiminnassa siirrytään isCancelled tilaan ja katkaistaan silmukka ja kuten kuvassa 3 esitetään, se tulostaa vain 39487 kappaletta

kuva 3

Operaatiojonot

  1. Operaatiojonot ovat kaakaon korkean tason abstraktioita GCD: llä
  2. käyttäen Operaatio jonot näet todellinen voima toimintojen, sen sijaan, että aloittaa toiminnan itse, annat sen toiminnan jono se sitten käsitellä aikataulutus ja suoritus.
  3. Operaatiojonot ovat oliokeskeinen tapa kapseloida työtä, jonka haluat suorittaa asynkronisesti.
  4. lisäät operations (tehtävät / työ) operation queue ja keskustelimme, miten voimme luoda operaatioita kahdella menetelmällä.

lisää operaatioita

kuten kuvassa 4 on esitetty loimme kaksi operaatiota (käyttäen lohkoa) ja lisäsimme ne operaatiojonoon. Operaatio jono aloitti molemmat operaatiot jollain taustalangalla ja toteutti ne. Ei tarvitse soittaa start() method on custom thread 🆒. Kun lisäämme toiminnon toimintajonoon, se suoritetaan heti, kun se on valmis.

Kuva 4

kuten kuvassa 5 on esitetty, suoritimme juuri tehtävän sarjamuotoisesti tai voit sanoa, että toteutimme sarjajonon Operaatiojonoja käyttäen, katso minun osa 1, Jos et tiedä, mikä on sarjajono asettamalla maxConcurrentOperationCount = 1

maxConcurrentOperationCount →jonossa olevien toimintojen enimmäismäärä, joka voidaan suorittaa samanaikaisesti. Oletusarvo on -1 eli antaa järjestelmän päättää

kuva 5

asettamalla maxConcurrentOperationCount = 2 teimme samanaikaisen jonon Ja nyt tehtävät suoritetaan samanaikaisesti kuten kuvassa 6

kuva 6

toimintojen riippuvuudet

kuten kuvassa 7 esitetään, loimme jälleen sarjajonon lisäämällä riippuvuuksia kahden tehtävän välille. Loimme kaksi lohkooperaatiota ja sanomme, että älä aloita tehtävää 1 ennen kuin tehtävä 2 on valmis kutsumalla blockOperations1.addDependency(blockOperations2)

Kuva 7

Lähettäjäryhmän toteutus käyttäen Operaatiojonoa

osassa 2 käytimme GCD-lähettäjäryhmän ominaisuutta estääksemme kierteen, kunnes yksi tai useampi tehtävä on suoritettu loppuun. Kuten kuvassa 8 on esitetty, käytimme samaa toimintaa Toimintajonojen avulla riippuvuuksien avulla. Tämä on erittäin hyödyllistä, jos et voi edistyä ennen kuin kaikki määritetyt tehtävät on suoritettu.

kuten kuvassa 8 on esitetty, meillä on kolme tehtävää ja halusimme suorittaa ne samanaikaisesti, ja kun kaikki tehtävät on suoritettu, meidän on kutsuttava jokin menetelmä osoittamaan, että kaikki tehtävät ovat päättyneet, ja mitä teimme

  1. luotiin toimintajono
  2. luotiin kolme lohkooperaatiota, jotka suorittavat tehtäviä
  3. loivat loppuunsaattamislohkooperaation (blockOperations4), joka käynnistyy, kun kaikki kolme tehtävää päättyvät
  4. tehty blockOperations4 riippuvaiseksi blockOperations1, blockOperations2 ja blockOperations3 mikä tarkoittaa, että lohkooperaatiot4 suoritetaan, kun kaikki kolme tehtävää ovat päättyneet
  5. waitUntilFinished → Blocks execution of the current thread until the operation object ends its task since we don ’t want to block the current thread which is main we assigned it with false
  6. Run this code and” All Operation is Completed ” will print when task1, task2 and task3 will finished

Kuva 8

kuten kuvassa 9 esitetään, me vain estämme pääkierteen asettamalla waitUntilFinished = true. , joten kysymys on, milloin se on hyödyllinen ja saat vastauksen seuraavassa osiossa.

Kuva 9

kuten kuvassa 10 on esitetty, toteutimme lähetysryhmäkäyttäytymisen operaatiojonoa käyttäen käyttämättä mitään riippuvuuksia mitä teimme käytimme waitUntilFinished ominaisuutta asianmukaisesti . Jos olet taustalla säiettä voit estää tämän säiettä saavuttaa tämän käyttäytymisen. Vaihdoin tarkoituksellisesti taustakierteeseen käyttäen DispatchQueue.global().async menetelmää katso osa 1 ymmärtääksemme tämän koodin

kerroimme operaatiojonossa, että Suorita tehtävä 1, Tehtävä 2 ja tehtävä 3 operaatiojonossa ja estä nykyinen säie, kunnes nämä samanaikaiset tehtävät päättyvät suoritukseensa

Kuva 10

Operaatiojonojen hyödyt GCD

  1. Operaatiorajapinta tukee riippuvuuksia. Voit luoda monimutkaisia riippuvuuksia tehtävien välillä hyvin helposti, vaikka GCD voit saavuttaa sen, mutta sinun täytyy tehdä paljon työtä.
  2. NSOperation-ja NSOperationQueue-luokilla on useita ominaisuuksia, jotka voidaan havaita KVO: n (Key Value Observing) avulla. Tämä on toinen tärkeä etu, jos haluat seurata operaation tai leikkausjonon tilaa.
  3. operaatiot voidaan keskeyttää, aloittaa uudelleen ja peruuttaa. Kun lähetät tehtävän Grand Central Dispatchilla, sinulla ei ole enää kontrollia tai tietoa tehtävän suorittamisesta. NSOperation API on tässä suhteessa joustavampi, jolloin kehittäjä voi hallita operaation elinkaarta
  4. NSOperationQueue tuo myös joukon etuja kokonaisuuteen. Voit esimerkiksi määrittää jonossa olevien toimintojen enimmäismäärän, joka voidaan suorittaa samanaikaisesti. Näin on helppo hallita, kuinka monta operaatiota suoritetaan samanaikaisesti tai luoda sarjatoimintajono.

tuleva

seuraavassa osassa tarkastellaan muokatun toiminnan luomisen todellista käyttötapausta

hyödyllisiä linkkejä

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

Vastaa

Sähköpostiosoitettasi ei julkaista.