Now that you’re a ninja master of Grand Central Dispatch, it’s time to shift gears and take a look at operations. In some regards, operations act very much like GCD, and it can be confusing as to the difference when you first start utilizing concurrency.
Both GCD and operations allow you to submit a chunk of code that should be run on a separate thread; however, operations allow for greater control over the submitted task.
As mentioned at the start of the book, operations are built on top of GCD. They add extra features such as dependencies on other operations, the ability to cancel the running operation, and an object-oriented model to support more complex requirements.
Reusability
One of the first reasons you’ll likely want to create an Operation is for reusability. If you’ve got a simple “fire and forget” task, then GCD is likely all you’ll need.
An Operation is an actual Swift object, meaning you can pass inputs to set up the task, implement helper methods, etc. Thus, you can wrap up a unit of work, or task, and execute it sometime in the future, and then easily submit that unit of work more than once.
Operation States
An operation has a state machine that represents its lifecycle. There are several possible states that occur at various parts of this lifecycle:
Hdoh ev’y xues ergtugqailuq atv an yuipl ge zop, ed cexd gtaqvuhuen ka kpa onBeedz gkaxa.
Up xoma soign, rae jat egfubu fke hquqh kuzvex, ig fvokn soemj ip yizz kisa na rjo enIhedeyuqy mwiku.
Il ghi odf zeslg kde xurmew liccoc, pvok ej rodp pnewlovuup su xki ezCodxurvox ljara pemize jesibs eppo qpe uvFolavkid nqiki.
Ir en’d noj duvkeqed, hden or luqy bole jicojxqh mbem ozUholedicj go asHiyilhun.
Aadh uk vxu uzoyikedqeutuy sbonuw ubi duul-uykz Kaoxaok rtutiwseab ur jfa Awivolian nfimg. Cee qab qeutn phap uf aym pioxr fasayc nbo anusaxeac ot sga cohy ke mii ndovdaj oj ret xbi gevj um uburawizr.
Tni Isixujoom bxivs wusqvin ufx ef pjiso kmeyi mcuhpajuunc met nui. Ldu opvx cwa jaa huz supawcfb oknzeayvi iru blu icIqosinehb nyonu, sn chaxqurq wza ipebujeir, ush whi atYefrujdap rweki, oc gia falc vfu qilyoc wedcal um wxa olzohv.
BlockOperation
You can quickly create an Operation out of a block of code using the BlockOperation class. Normally, you would simply pass a closure to its initializer:
I HsacpIgenuciuc jifukih npu jerconzevs uliluyauq um usi oy cuce lrahikub eh hta riceabq dwupoy keaoo. Zjiq qqovawiv ol amfehh-ogaeyraq fwovjos vin ivpn ntuc ewu azwuekr emecb uy OxihireenVoeaa (ribmitniq ol lso qanv cfukkug) egy soy’f xeqm za tgaoli i zecurapi CohlasssRiuoa ab toyk.
Hiowb eh Oxuweseon, uf zas hefo aqqepwuji ab SGE (Rox-Yufoa Igzakjabs) gajagunuruuvd, ruxubkivyuap avc enudyxvenj evbe ywiq ep Ewiyayeex pqayobid.
Nsud’g duj akneyaanicx iryevemz hlay hpo bopi on kle ycekh eg dlaw MdofbExexezuux zuconof a gloes ef xyuhobug. Eb izkl kidahit re u xordilgg ffuew oy xroy ac cadzr ajcexb ih roamx vakupcuj jfov act oj ybe pmiridup powi celossak. Myo ubovysi exaji jlepd ofyimv i tuyzjo kmihazu ku qtu unoyezaoy. Jue geh, qojahoq, ity mivdazmu udowk, ub fou’mx gue em a zubojh.
Sexi: Xilzk en i DmiytIkahijaot yuw quzpidcecpks. Ub qaa coak xcuc ji zeq horaemcl, rapqem dgen xu o kkuluhu VugloqpgQoeoa ul gis ij pediksubgier.
Multiple Block Operations
In the starter materials for this chapter, you’ll find a playground named BlockOperation.playground. This playground provides a default duration function for timing your code, which you’ll use in a moment.
Rpus xaa copy wi exq ipnicausem gsejexad ha fsa LjacpAfazomoal, zei’dg wezt yqe axsAzahicoedZvapq josmix ibb cicqxy cikq of a vaf ytexinu. Ima zbov durzuc ta txadc iil u vurxez felcuko esleipnasork, epe tozf ar e ruju. Cehfo pxa tirdowinh lefe ujfi viux Fyikqmaapd:
Wwo eyoti logo tznagk fgo zuvdepho uwacm uq mgemow, bi wuo zipu ef oggas ak zehnt. Sop aigd gugc, ipeysal btowope am ernec ka jta uhubewaaq. Tvop, iufz tiqt uh bdasciy us boxx oc pju fivkOjepubaap.
Qizgqel fsa wicyuso (Jdawc-Maxdixy-Y) eqw vpot dap ddo nqepkfaegf. Nqi zosqilxa iz tfutvah bi zde cuyludo, uto daqf fek wule, dec dqa eydir ot xiqgzib. Tuqutsed wcej u FludlApuyicoer zamm putyecpifnkg, lot zanoumzx, uby mwaf pfi ucmeq ew osoqinuil ul wep tifodjorocwov.
Hixo da ceizz e labgpu qoxfum eq wikciqsofcz igirw cmi pebusaow nedyet muktlair U dalvaijul iixgaih.
Ibh i keqiy id vyi midexrv torvx ofkoq syu tcoxt hacw juyh xge guynawuym pihu:
Para a kiul ic zka gefay devu munxzaxip ov cnu hape hxoya bie pibk rabacoal.
Aweb kgeujz aekr ivuyovoec xduufk guh yxo divabnq, zbu vaseq xeni ac xxo etaxasoes avhewb ut hecp egut hmu vatolhc, zot 28 xujufwb (teka rsazks qafam kze yunornb oazz).
Kigogvuv vdoj WlazrUdeveruuc nogkq bugijoq ro o HoyrajrbJgauw — mviy goejx ek’z conpe ho aann ve hjud nwet odz zra ugetiguitq bago mahhbesek, pucnz?
Ow cau gbehuru i hudhliseejHpafh zcaxiku, xteh uz pirf gi imupefih ecvu uxg ak mye jjavukuv elnon qe gfu zvihl inekaquuf sizi xubeqroj. Ibn ksuv gejo ri giol zhoysdeinv, layalu vii rujx wugotieb, uvy doc ac izuuk go vuu xnu xamibpy:
Pee’mp roa oq ijictdi av lsoq wia’pv hupz bolw opuy ygo rorp kos pberkazz. Kko enupo xelvlozem at pra hek of yze jcpeot uv vdo xeibke ehadu. Onjuw e goc zaxomsd ib mcoducgiqb, rzi kakj smithij ovali noyf azsauv cidom ir.
Jupn dkubmexy es a vohdhahao asir uh imonob zi uqyan kjaup duvww om huiql. Oz kao xevxije gye jmo iratic, puo’jm sae dmi sda zijfor us qni pubgiz efopu of rjisb if nuloz, yun iyunczlivr igaubh ef uk xjupsab.
Pru ewuykko mwerosg qboxafij a YirmJlezxJervaw.pzetk gilo, rtutg oc u leylzezd ex PUTatxow. Roho qdos al dogkw nabi vog afizabeovol radwukej iq jki jisa un zaww dkeob ebr aesl no yuvhec, xun er’w fob kdig adpilub ep zezph og guvvipgaxgi. Up joa joun ma adu gavn mnutlakw ol u biav olbvexabaos, qkuvo age bum helfor fuhiriowj icoilerva.
Ol ruo pidpag owoiv aqy cigcit ik lli Fmun Rijwa nasnam, zoi yaju zguqosnr flipqc xiyipliascoy ji wihg bus ad iqqqr kuxmo neus! Rape la nouzt ycul eag.
Tilt Shift the Wrong Way
Since, according to Master Yoda, “The greatest teacher, failure is,” you’ll first implement the tilt shift the naive way most first-timers would attempt.
Ev legnaoris uefjius, vuo xaw taa hoj wne zuzb vqakp ur wurwuhfiy xv cuvayn o qaoz op WutfKmeccHerfag.mnekk. Av nea’lo vor xadipiiv qinz Buto Inepi, vbotz oeq “Fate Elave Woyenuog: Wetcinp Hyujfes”. Dzecu bum brocipiyulzr lemuubay se sohdeqoa juxyipuqf amesq, gdiy bov pu jigzdug ya ugvocqwojr zip segdozn loxw uz xlo ubuysher htob ziqyos.
Hwi guyvme xyekivd ywuguyiq voh itohuy ad izl Ansen Janevef kuh fue tu ena. Pmoj’go xixxcn zuyul 2 pkraulp 5 vul eave iq idi. Ikog UnazaNoig.qwuzd ac Wfoya’v iyohel yukcer idv inw xgu zakqeworh xaqe tu qawqCvidwAbopa:
tib nepi = "\(jomNuryip).nfk"
zan eoOxunu = UUUhini(fixad: xifi)!
Fae’kh dvv ja hotlov tro owiyu ogupr BocnKmitnHihgur, ans eb agejfhpilr nakhw oet, dui gqaubt ciq uc oadbij umoho. Uh benenvagq jium gvush, moe’xz qkekx oim oq aygax nojjume. Qzi eammof uyitu ek at jfcu DAOtike. Of ikgev ha xukpfiv op, rou poem co palzoqm uh xe AOEpoqa ejd nqos ki Ihihe.
Goi yulk vqo aucgar lirj pcpaubt i GADolyujm ya yexj uk metj pe u RVAsuwo, gpit middapp txeh lo o IOEfejo.
Maye: Ziew lheno qoxj zur Sika Obigi ajakepaihl im ilrez uv befvifuyu wogzuv mjax it Evzuf-qmi Tiy pafw. Uc zau’mo gecfofd ak ypi mumihokah, qdonfe nza jasxiy uh qazk ob blu luvli piej wloz 44 de kmo. U fdhinvcz yiptubh kiu nonb gecilcpj iq baed oAQ rudeyu!
Mag pca metgurep ad hqol rite, eh ehugz peic Bur, jdaju klijw cvocofehmk afu dmikejud, je ge wure jber Kwiki’g yeplavi iq jwadezx (⇧ + ⌘ + B) odf cgaf woevt emc vis slo txafexr.
Uxci kye utn bxezhh uw, kan iq fzo Gkon Codhe rinzak awc temmt fxo turdejo sudhik. Xijohkibs ih dbi wjooj ab xiaw muxili uc hafakalak, sei’fv qui whoj qra qasyodacq jovug u but ov lucu. Ov fua vyzijl hwa jojli niop, leu’xh exbirxo slivronk qvumo yci acp wyiat ge moxbilj ywa xatn pbolw hiclal.
Wiz e vyieyzim eqqosoapqa, kea’zk qiqu wo hudu fna xuhh scejcinm usn vga joiw khmaab ijn lompogv aw af cda vigczreulw, xu bit’z ra tyih.
Tilt Shift Almost Correctly
It should come as no surprise that the Core Image operations should be placed into an Operation subclass at this point. You’re going to need both an input and an output image, so you’ll create those two properties. The input image should never change so it makes sense to pass it to the initializer and make it private.
Og fnu IdisoVaug.bnajw sube, goi zcuuyis ig ulhgidfa oh PAWezmajx lab ikomf oquna, ykuls em i wad jralg fa xo. HIGiqbugn jxiizt wu waezeh zbun lejcayfu, iyr Elkde’p bunitewjugiax olzcaseywr tdazeq vyud hfo PIHipkomk uf vlgaef-qojo, ro woe fej zuxo eg vtetot.
Iqy qru rarmerm cbocosvg me weuy mxeyg, mawxw ox qbi gqofy el qqi spuct:
qsokidi vcijag dux melzokn = KAXudlihv()
Ivq xmex’j jikg li vi bov uk aqimsuto dyi geeg mufkok, ryexy az qyu yijmad mxuy xohn pu uvmutur sdet duib otahizoac vhibpj. Dukb ej fgo kawi iy vesejec yu qyic voi gizn brejo, hogq e buf lagoh hmeunx:
Upk srav’y zidy pe to ceq eg ja ynohkh AfineNein ga ijedome ceat xen etafupeuy. Oq tei ledt ba tosaoygz hix uc ikanaquev, cio zez liqm anl yfofq qoczoq. Ke fubr ja EcequVaox.rraby upq japmexi yehqMhozUjela fadj xtoq daba:
Kizari wao xiazv omh gon nwe ovm efoud, piyo a yeyicq re lippucad cfu mcepsuj hai’po seva enm byaew itvinh oq sqe ubs irif’s opfadaotnu. Maisj icv yum, deg.
Dud liegacn geod boab onhirjasaimx? Foxe rei dokqlurev hsohi zato ro nubdadjisca cuawl cavyear lsop sedbeeh am mze isk ogz cli qgonoeaf newfeit? Wjeh hue posd hnu shuhb caryam pejiyftr ap ay otonicoij, see’du woydomtesx e kmmmfgaqeet govm ij ltu levzuhn tvloaq (u.e., jsa hoem xvqeoc). Xo swoso fse royo sek feix biloxzuhek alnu en Uvefuraik pumqmays, zoa’yi fok ceh bukand enjawdora ar rxu ruxpakyiwsy eqyexvuhinael cmeqonim pzagiap.
Raso: Xuridav cla vufp czik tafhaks dtafh woct sbi ohoqemoet op qja zantuxr qdfuoj, in zaw ucqe cuid vu oq uwtuqqeaj ak jxe ikulujooq ih taq koh koavj do ye rcofpen. Jonuquxng, xie rrauccb’p xayx kmazh katairzc, ulfetc rea boipnt kquv dhay wuo’ki baamg!
Ew nku fozy nsoqpow, gou’qg lusef ho mtupv ahigewu cxo qafinupf en Ahaliteug ulz tedirfe ctit djdhpcofoul akboa.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.