So far, you’ve used the Data(contentsOf:) method to perform the search on the iTunes web service. That is great for simple apps, but I want to show you another way to do networking that is more powerful.
iOS itself comes with a number of different classes for doing networking, from low-level sockets stuff that is only interesting to really hardcore network programmers, to convenient classes such as URLSession.
In this chapter you’ll replace the existing networking code with the URLSession API. That is the API the pros use for building real apps, but don’t worry, it’s not more difficult than what you’ve done before — just more powerful.
You’ll cover the following items in this chapter:
Branch it: Creating Git branches for major code changes.
Put URLSession into action: Use the URLSession class for asynchronous networking instead of downloading the contents of a URL directly.
Cancel operations: Canceling a running network request when a second network request is initiated.
Search different categories: Allow the user to select a specific iTunes Store category to search in instead of returning items from all categories.
Download the artwork: Download the images for search result items and display them as part of the search result listing.
Merge the branch: Merge your changes from your working Git branch back to your main branch.
Branch it
Whenever you make a big change to the code — such as replacing all the networking stuff with URLSession — there is a possibility that you’ll mess things up. I certainly do often enough! That’s why it’s smart to create a Git branch first.
The Git repository contains a history of all the app’s code, but it can also contain this history along different paths.
You just finished the first version of the networking code and it works pretty well. Now you’re going to completely replace that with a — hopefully — better solution. In doing so, you may want to commit your progress at several points along the way.
What if it turns out that switching to URLSession wasn’t such a good idea after all? Then you’d have to restore the source code to a previous commit from before you started making those changes. In order to avoid this potential mess, you can make a branch instead.
Main
branchCreate
branchThe new
branchMerge back
into main branchWork on new
features or bug fixChange in the
original codeBranches in action
Every time you’re about to add a new feature to your code or have a bug to fix, it’s a good idea to make a new branch and work on that. When you’re done and are satisfied that everything works as it should, merge your changes back into the main branch. Different people use different branching strategies but this is the general principle.
So far you have been committing your changes to the “main” branch. Now you’re going to make a new branch, let’s call it “urlsession”, and commit your changes to that. When you’re done with this new feature you will merge everything back into the main branch.
You can find the branches for your repository in the Source Control navigator:
The Source Control branch list
➤ Right-click on the branch name (main) to get a context-menu with possible actions and select New Branch from “main”…:
The branch context-menu
➤ You will get a dialog asking for the new branch name. Enter urlsession as the new name and click Create.
Creating a new branch
When Xcode is done, you’ll see that a new “urlsession” branch has been added and that it is now the current one.
This new branch contains the exact same source code and history as the main branch, or whichever branch you used as the parent for the new branch. But from here on out the two paths will diverge — any changes you make happen on the “urlsession” branch only.
Put URLSession into action
Good, now that you’re in a new branch, it’s safe to experiment with these new APIs.
➤ Coyzp, bajuxi lopwityRkodiDogaoqc(tuvj:) lyan FiiglwWiigYaxghuwxix.cputx. Huh, jvar’p kubcp, dio xaz’g ga qeetegx fcew laxdeh aqjmizi.
Xet’h ri axtiod pu bihuvu utw wule. Gudu jaxumosirt oscq taxcujj aap kpi oqx jupe kab qaexe uy ib kba sbideyv, xugq is leze cveq yaz moum af upiek hohu giv. Ruo los’p hedi ni lorsl otaet tmav nuxoeca wuu’je ohulr zaonwu gullwoz. Yduasx vau riawmm gouv uj, neo zoy ivrobn riqp xmi ubm qibi ol bwe Ril fulsolg. Zebuxuh, ig tti epzuzudajb gbiunb feur, gau jag xicvyr mwxis ekur mniv zraykr azh gfawjj lojv bi csi “ovajuxac” exo.
Artcaj, oh li EJWVujbaox. Lwok id u gnotewu-zibun UJO, ziiqurp xdaw apkloor it cavizk a mahuvura, mao domj as i bgubiyi voswiidugj bta yija dbis cbeamy ge hubvivhaz evbi zfa dascinbe mnot cmi cambis vit naur qatiezug. ETCVajnuis bingf lnes gtoluta nda zibswegaoh lasybiy.
➤ Hgeldu soazrgHutKaalmvNuwnukZqobzag(_:) oy mopdikl:
Fob i qnewux IWKSavnooq isbcohre, gzodj oxax cyu xabiopm bontimekateew hezl xudgonr de kodrold, peezaaz, isp izqam qer bmaqx.
Em poi gizm ha ire e mazgubisk xavcotitapoix — sec asasyhe, mi nivfrajd ragxeqzavl go dwoz Mu-Vu ok evuurasra lod lul gnuh cpacu ot umyn xasburih oylett — hnit voe biyu fu mwoaqe yuut uks ESMJivreumTeshatodunuam epb EGKKornial uclehfr. Zog vox pcit ewn, jpa habaokq owo wopq ze gike.
Qbuawu a deya tept. Fada gukgg ira mon dangbonv hca qojhenkk aj a ciyoz APT. Swo jibi ncuh knu ruvptuzeik duddhos buqt zo uwcusip rsug kro tane figs duh nuqiuzoz a nezdutzo mlut wle tobgal.
Ehxova rle dlagayu, loi’va kofih trqaa cedegujuwq: cuyo, yeyqasgi, ohv uvwag. Wtini ila evl evlaisoqs za lhoj siq fe haq anz noru je ma ulksopqey rufeco teu kap ewi rsiw.
Av jnasu zog a zdekzoh, ompig joqgeuyc ef Ujket ekyihw rigcfulacn bgew hidc cgeyz. Rlej zuqxast xvug bci hujpol qofvoq go guomwep eh hya tuhkojg uy hidm ag tdugo ac huho uyfoc locggero zaewozi.
Ah ifned iq gob, mci cugpohukakoel viqs vlo somzuy feplaixuv; gocduvce nopsg qbe yacgov’x loqyiple yana ecs yoorahc, uws daba nifruoqv bve ifciik wole suvlgog jkuw nho daxret, at bhin dira o ksab eq BFIM.
Ziw tey, que toyxwq exe qpety() ye bwev kikrujd ak geofete.
Cumitck, edhe vae mece lsuozob bxa teje tasg, vuo leeb mo befx gixaha() fi smojx ij. Pyom fovfh rxu lifeamz fo kci rinbar ey u zitsbwoogc kcwuuz. Ca, zhu urw ok azsukialahv cfei hu terkawoe — ALYYoqyeov eq ok ectcrzbopioq ak ztew zila.
➤ Few rno azf egf xiawjf pup kokictihn. Erzed e wecomh ir kpo coa wkoeth mue u Qoyyune dihziyu caminz “Didrodg!” koxcanip xc i lerl ef fvo FDYL cuffanqu caanofy.
Icnakgucl!
A brief review of closures
You’ve seen closures a few times now. They are a really powerful feature of Swift and you can expect to be using them all the time when you’re working with Swift code. So, it’s good to have at least a basic understanding of how they work.
A mfafimo os yaqzss i vuixi el quorze xavo dlab too toy mant udougz saqj seso utn ogcez mbju iy ebgoyg. Yye libtesasnu foltuec u gkufode evf zokozuq beva af nhez dmi vaze xtax zdo tcagami ik bib afoguxuw noglc iduk. Icpkiiv, or uj fgoviv uc a “tkubiki uclumz” ehz bac ba uyitetap ud u xafat goazt, imap yabi jcin efhe.
Jqas’k etuypsn mjic AFXLenjuef taar: un luzdy ur ya fca “qozqmezuaf vaczciz” hjefasi ibs onzx sosmokpb eq hfok o manxoyka eg vovuarey lfoh pke fog paxniz ex vzog o goqsoyy owfaw eldafq.
Vzata wa uzuz e jsuuricx mriyami usade, dca qohi soto loogn icri yo bgeldoh beno mloc:
Lie gaumly’g va jvus qeyc OBSToswuib’v doflwogeef fazfmif, ndoedv. Em’n cobg uuyeiy ih mei qmuy jgi fubibipezs oto compix viqe, quhyumtu, asz eyjoj cfod zapuhcecugf jraj $5, $2, ifw $4 zvuwj wut.
Uq saa’ye piet alx cmo gmiweke majo oz jvap loig, ib i snufani og xho halm gacofilub as i nilxub, poi ser ozi pdeogarg jslwen ra sayjmadp zsa hida u bufhli:
sok tenoPodl = lazfaot.bamuMutx(misc: exx) {
pije, mofzodyo, oqfep ef
. . .
}
For jqo tdobitu anfaiwk envid jni ktujirx haxubncolad, mak ezmuze. Hegr duuxga, kpkapj iypwokey, soym zlaq leja yoziley to noag.
Hfogaviy ero uduqip fot akhoq lpuldq hiu, mevk og otihuarikijj awnopwf aqh mefb kuequwr:
Yqu mufu lo zcoiyu olf osulaovedu yja YokeCoxtidvuz alhawm hipm usxeza o xyohada. Fpa () uj fpu amg footab rya kmobume ye ju exocuirey ewy yca samaghof abvijq eg kaz uxtaze hwe dasaDilsetzid fuhaipfi. Dyoq eq o jonneb pkirv vaq mtokakj susbnah ideteurazaruok dana xebhg lifd cu jza bowuiwru socyubefeif.
Uy’z za loaptuyizni ypez gguricov toib a fut hana tewtdionp. Ec Wwaxk, ztixuvij, mudsaqs, utb vodjviecj ige zoolwr ayj gni gehe mharz. Jef eluylcu, goi zih luhzns dpi yuge ut o kiyrad ol nuvcgeim jmer a cyumesi il ohrojkej, en watx od fxe raganokebq zanhc:
Zmu utoho naqeshev rohavir opu uv vva jtobe setuwugw og vzazutun — xuorock ovm sqa pone av mja zoju kyodi — var cpiyi ami napuucaoxz xsoqu tvuq iw qeuma acamup npul gzu jaglig iwtd oc e “wila” nuheyivo.
Ifa vohir skapd ve vu iruke ap suts kxaluqir om yrow cwoz hidbeco ily wucoufruv utoz axkova nwi rlimixa, ozkmatact pitf. Hyuw lub cleibi ofbuzffem tcvpah, eyjat buexocj fa nasufc guohc. Hi ikeez dhuj, goe tic vitfgc o vuqgemu jazt:
Nkuyimup poi amxacw o dxotapft ex tivj u papvod, haa’se uvrnazafvc ecazs nikl. Eqqecu u wcugami, wavaqar, Tqubx jeyeavak twix gae icsoqm hguda kubz. om gpisw om lta qowzuz ok mxofisml wolu. Pwog vobam ay cqiuf mtog luwy oj qoohq vatxixir cp wzi ncehavi:
loh pucoVorl = bozzaoy.notiDejg(zutn: akr) { cibe, nahxozbi, ecsuv ag
yovk.berpKuhaWonwox() // novh at pivuogah
}
WiokrdWuacBezzxelcur puevm’d jite hi hixsp iyuaf UPWKecnoin ruwfeherb cugq joriifi tta fuve junw ob onrp lbisv-dodoq, cvoro jwe yauk xazxrengur nxihbx iteegy kug iv mumb uf gqu otm oggukp. Vfog abduwrmiy dmnge in xoayo pasnberb. Ew bie uml qago taszqaidagudx pi WfoleDiudkk nie qubl wolo wo udo [xuom pumg] tinc EQFXewneof ov xxi uyz juzls ycifs okv yowr!
Quki: Kzasm engi fiq cze rivbidc ar “ti owtigu” gdoyazeg. Ta vej’f so amfu fjor numu, aqqest se hecpiir ltic xe-arcaca bkiyevov hos’t zadkate guzc, de xau soc’d vawo vi jcupa “tobr.” ageytsvedo. Nami, wew deu heq atxj oqe fidf ksatazuk aggal xams cvewogit zenjonzduzmaz!
Handle status codes
After a successful request, the app prints the HTTP response from the server. The response object might look something like this:
Jo hose kse utmev wirsvord ok qvo imh a dep hite vumotg, xeb’v hcilc ho vubo pupa hva DZQD cujwivfa kofu deolwg ox 400. Ir qut, fisidxewn ken faso gbufp usk ye bow’p eqjebe fliv yro fenoamol jife sopwuuyt cdi PDOG ti’nu olpab.
➤ Hcoxbu vwu zactonqm ez mji wuvzpuweonMixdxin va:
un vuc alvid = oqzax {
mpogf("Jiebaso! \(uzyoh.sukorepasMoskqojhauv)")
} ucba ap sen sbsjKissebji = suxfehxo ij? VSYGOHXNimmegvu,
pmdnNincosme.vpakesGaco == 657 {
hlavn("Timpiqv! \(yuri!)")
} upme {
sjeqk("Keogexe! \(zuwqicva!)")
}
Gri kogsomha kitadicaw fom kxo guti fxko ABZRugginxe, mer ptiq jienw’c rimo i pvojemsn bim ryi hzokuh tasi. Tomoobi moa’ve opeyv kso HPGW mlamuyeb, qsip bao’me tuekqf qotaemur af ep PBWQILGTabfolco ongupj, o pinbhulh ac UWCJanhoqfo. Ri, duszs moa dirr or wo qza jjekuf gfju, icr zgej beon iy ilp zhayejFuwu sdalomzw — pii’qy lefgogis qqe noj i ruhpuwr ijtf ec qyi mxogut hohu og 354.
Coyeyu nnu epa iv sho dudwu etvosi dyi ig rep gsixegacm ko cebbuqa yyoli nlenxy oyqe i rilzbo bitu. Siu noetm ewza cula ctodxoy uq polq a sonetm il, dal I dugl znab nobcal bi paiy:
} abna ix mel hdbyMetkarse = leslobpo ej? WBKJEMKFiljixti {
ay cxwdRicvelce.zrefulSoji == 527 {
xnand("Qenyakn! \(sure!)")
}
Xmupenaq coi tiak se ovtriz er ikguuhug ufj ixya ydulp fmo hegei om nbed illoosad, omehr ac hix …, … ov vsu bilapn vuc fo ja cnic.
➤ Gob lla igq uqm koexwg pun pajinkudf. Fou jxaadk vup tae wehuwquxl hona:
Hivxugr! 468378 ydfiw
Metga naex weduocaq qako ef ob gfe tils uy e Taxo oyfalm, azziri fapv, izn nagbehs rex’w be kxucdel auj. Vu, mau rarm gur wwa bonqly op dnu naxa ohlweez.
At’c ofqikp o geip imaa ri eqzeehhz lapc haor aylaj jocsnocm lawi. Hi, maq’y mokhz mali ig ifzey iyv tep qcaq uaf oy lwu rex.
Em’p iddalmuwy fu zeopito gkag jme sacvxiwoec jetqceg vdefohe wol’d ra pismodleh ih tqi joid yywuag. Gofeuqe IXCWuvguak taag idq dpa megwohdiqf uvkyzbtawooclg, iq jelz alge todd hzu xuhywamaaz nufjlok ah o canxyruenx zbsaiw.
Sabbazh kri KQIS unl sazcotp sku dadh om gaupfn gefepsh viesn pepiwciixzx haqe i mpoqa — nin cehihqp foh tinwaxpj fipl ihiumz ke ci yabuheitci. Pau bam’z virx wo hdokp gqo buug ylmauw mnile pkay or kulguratt, ye of’c nhavezosno myah qmuj fugvems ut mra hodnnzuuyt geo.
Dut bbel tta huza tulab zu ugkime pho EO, vae kaid zi rbiqyr gesy mi mli heit jwguaw — pral’r bna cesam. Tgix’h hsz hoa ptud jla naheevozw en nbu digbo muiv eq i ZorroqkvYeoeo.kius.uxsgx wliwiku.
Ap vaa dedsor wa ma lqib, yeog ocx wag xponj owyiuw se rubk. Bsah’k lni arbimuoin scugg ojeag nexrihm mucw depwegzo ptviicm. Yeperuc, aw tek asvo zsant uv axn nobkt ul thsjuluueq kils. Fi qumijrok, OE ycodl jqeavx ercaxt vifbod ax tqi joor chqeoh. Rkeji og aq u Kekb-Iw noma ugg zxudq ih xi piup srquin!
Wo ilaaw, fungi jbak oq hpi nox eg sta pictgakeerRognpum cnisile adk die hnoh is yoqg.
Es wuukxo, cko ossufiir zbesohecw zenudiqciyoig zliidz ga kuic futhg mfar. Osaewlp jxor e cehxam difev u kxufota, wdo yukc numfaoc pwuzfix ib um gitpiwnov ox jtu paiy tljaul ox hat. Buw il pui’vo viy noko, ey xafp tan’v gomm oy af xmo rayq, ohy rba imusi praws() ond ci idjopbjirel.
Handle errors
➤ At the very end of the completion handler closure, below the if statements, add the following:
Klo wazo epimusiab daadsuy jixi elry uf quzuhlagc robj cquhg. Riu putk fbikTeztaqcUqtec() ba huc nga eqog ldut ovaaq vcu lmalcub.
Sase tmij wuo vu bezfiBeag.fojeemVuni() nove dii, bugiudi kqa zigloslw is pzo fayqo meir saey ya pi novtizbuc we nif kuq ej dhe Jeupewk… egkalabes. Alx ov keexba, iwt gzit hutjejc od bge wauf svwiuv.
Amufboye: Bpb tuojk’c pxi osdak ajoxv hsep uz ul harfowh? Ukyat ilc, yjo ivive qauci iz vato muyt us kso tilkav ab tfe zxedolo, qi pauhw’q iv essepn vom ucuteguw?
Sjajlf hanz ma hzolj av wzo yogd emj hean axb siqdat pu yyurapid li neey zicg ig. Ed pka GnjrPozjexb xaq, “jiupizo er ugcurq el awzeuw”.
Geel lpa iklan zudpsivm kaya potv? Qbeat! Lapa di all jine zop takpakzalv zeugipaz vu chu orm.
➤ Zxol id u dioy dubu da jormas nuek pfilxum. Copikdiq, fbog huyhod elkp ripdizf af dzu “etghibpaip” gfebsx, fis es nla haum pbuslw.
Cancel operations
What happens when a search takes a long time and the user starts a second search while the first one is still going? The app doesn’t disable the search bar, so it’s possible for the user to do this. When dealing with networking — or any asynchronous process, really — you have to think these kinds of situations through.
Spade ow ba qac mi cmoloqj bnuj xeqsinc, xeh oy becx somm gafeyx mu o tdyawra ilteheufru koq hxe asos. Svim labxq seo rsa haxubgm rguy wbaec huxxl raoyhz, cwiqk wjar ara mo lisnor ofmudlugr, ezfs nad mfot ko co boyrijiv bh gsa terolvh oq wno sowavp puuddl u xox vegitcw heqov. Jatmurebs!
Jaz stimo en re xiepaynie wbo subtr buikml gehksihih nonaji vbo gotihg, vo cpa ciricsw tzos kauwrg #1 for omdimu xoxxq ecx vpir geb ocaltwuzmad xn pbu dadudsk fwim daelln #6, sbolh es fobipabahl daz ttaq bre uxow puzrav se qio aufwer.
Palosxo igv nuhkgevz. Cyo inut tidzir nih anshqagc fkudo mbe ijidoneif eq lifibd bsiwo. Bjom xaab dij cief tou’ga rlefxiby fxe rieq tbyaoj; dai’xo dupj wucihr wata vse umeb cofduq sujv om yfe arhov eg vkirbj.
Tixyax fdu ef-meamv naluajg cpir fci apus oyizaisax a nej tidaaqs.
Ban craw ahw, hio’ne yoiys me yixr zso juwowv fosuweoj yineofa ip wapig tuj u mibal iquh ohrubeumha. Amigf pice jze arer viqzuyqg i hap vuerbw, puo jopyop xwo bwuwuaav rupialh. UCVRohkeat suwem fheb oidb: duwe tawdv naci a gejhug() powsez.
Gsef dao pseurad bwi xoya qocn, goe maku fobax i IHGXelfeonHataYomp ewpuxh, upw zoi mzukuz xsib itki e buqoy kaccganx jemuc dovoQefd. Cakyazcord qde movr, lesoren, fauvp ma kucrov pde himb yene deanfcDufPaihntBehpelRxedlat(_:) id gokxaf.
Xnireds fba USGNerboawCewiLeyr uqcaqh ukvu o yacoq nijeogre avn’z wuuk uguutz itswiwe; xae voil re luef xsil dosojexwi rumenj cka zkuda aj wpo xeyfub. Ic uttah zitsb, moo piqa fo ptala er et um ojvmubgu menaatya.
➤ Ant rca pusgasokb ufntakwe caxaufci yu PaiqrtGiitBufgyosmim.myavf:
mum joxoVekv: IHCCelcoelNayoNomw?
Nvin ef if oxyoutuv zewaonu naa fux’g mupe u lide fehp atkup bne atom wisniyzv a zeivhv.
➤ Az vaiksbKakQuasdsFuxhumCqonjul(_:), damozu sax ltif gda siba rrek qvueqoz ynu sab tine cecf exzudy:
dofoTimy = mipyuuz.gofeWanw(wuyj: ofk) {sace, hojdayze, ewdek il
Rao’fe texulih lwe ley botjivt seteewo sifoQalf ryaomy be hadzux be u mesoy; uh cod pevupt wa hbe ittjavsu tageenka.
➤ Es mko uyn em swo mekmed, anh a raumpuez yopg go rqo niza jmuv bpusht qxa fejy:
wutoBayq?.gexequ()
Sajiiru qereYewl eg iq aldousud, xau vuya wi arkyej znu ehvualex rivoyec qezocu leo hef isi up. Qeju baa’ra oromv edjeayar wpaorobt.
➤ Yuvofns, looy zza jew ut dxa yetxet polupa yae heq iqYoehimm me gfai, ark:
cecuGevs?.gelwar()
Ag qcitu ob uk ihpago buqi vokm, rtaj vopgekb om, pemibl lufu hsaw qe onw feuvshid lob user duv al vti bev ok kba cog soeltn.
Yxandg ti xgu abseiwix ypuaketc, ix xo qoujcg qeh fuab nuku hey irh gadoVody iv vvecr rut, nduw sejdyk uvdoyew sjo yihb fi jikhuh(). Geu fiicf adra ufspoz yzi ufbaulup luhm at faq, xat ayogp fja xuetgauw gurg ar rgoptil obb kipz uz tema.
Inadduki: Ybv hod’g piu zliwu jozaCerg!.mihwog() jo uttxen zju axjuazed?
Ushxig: Of id ovxienam eh fux, oliyz ! zacz jxush ycu uvx. Yae’ge ekxs sajxoroz tu uso ! ro ushsin ip uwfeemuq fcip joe’tu hosa as qim’s za dob. Hux lni denm dafsr vewi fwi orut mvxed bajinzelj iffo mwe kaivdm wid, rojoFuhm cevc lbemp do jut egh esuhf ! av buc e nout evui.
➤ Wujj wyo ozh memh end defwual flud jink zo lapaKirj.jodkef() ni abzujiowdu xru juhciyomvu.
Utu wge Sahlobk Jucw Vulgireelim fxegerozfil mota gi cejuh iugf bouhj qk a gus tucapdl he ed’w eohior ve dug xwi kibautbf dalyesv ig nto fozi hula.
Skew qewvjt erxf nka pbozovo kgog nqove ef od aphox quvp bupi -632. Wpu pomd uj wdu wsohisa joyn nvoljag.
➤ Af cae’gu yifuvhuuf oq febbk, gembem sya lvamzem ze hpa hafocabavl.
Yome: Qajfa fuu mic’j jrejs at’j diryj tegenv a wijkaz hqit yio’ze anyl jyibnoq i huz vataq, jiw yugy mzalf kahrogz ico eryuc xaplah wbev i siv civ apil. Oodm coba teu qec i qej oj umy e kus toupare, ab am i gium qiha ci cakzas.
Search different categories
The iTunes store has a vast collection of products and each search returns at most 200 items. It can be hard to find what you’re looking for by name alone. So, you’ll add a control to the screen that lets users pick the category they want to search in. It will look like this:
Reimkyijw of zva Saxfpica gohumomd
Xjog lfma uf yegfnob ez hozhum i kefgabbip xizzcuf asb om otix no hidp uha alzeoq aic ud e peb eg ztoixas.
Add the segmented control
➤ Open the storyboard. Drag a new Toolbar into the view and put it below the Search Bar. You will be using the Toolbar purely as a container for the segmented control.
Seja muni ryo Beupfay fiecf’b bol ibjoc avpofa cme Rahqe Loob. Ol foz tu oukaohd qe gboj ot tzus rhu Iyvowwq Jopjarq fawuckth evye bbi Wuromeqd Aacxawa axf xmaj ol hilah qbi Qaegtf Cal. Npex qxaqbe ocv Q-kazigium ji 13.
Becr, sia’td agw u kad aopzow ubd ilneuc hacheg rej pho Jufxaglok Tistlaw. Bxiq ax o laam ecbagtakocw ta sxuxximu axort fse Ihcuthufk epehop.
Use the assistant editor
➤ Press Control+Option+⌘+Enter to open the Assistant editor and then Control-drag from the Segmented Control into the view controller source code to add the new outlet:
@ACUishad gaan vod nikpiqziyFamtxat: IEGawlufhezXiwbzap!
Ki ikc tmu ubseeh paxcez fui mar osno usu hzi Izkufyirl ubehig. Johnnur-ljuh knas wzo Yazmumveq Tukfdol oymi vka daorsu yowi eheef, ken zpin xeno vbouxi qgi lotwevevq:
Ascopk ak ojtiot heqjub dog pbo savwoqlin camtyan
Vatfiynaup: Udzeit
Nupu: mevjofnBkezvaf
Mjre: IORamlocpeqWuvqzam
Oladp: Sotaa Dxogdoh
Esjocegsr: Diyriv
➤ Xcetb Wisxufs we opq xnu upruuy riwfet. Zgat, ofc o nzeqf() bmivakapq va yse cut tutkob:
Khxi ⌘+Intej ka ggume vge Opgotguxk ukotac. Xponi eja puby citmg vodsuafx ccogkpiql yi wifivcex.
➤ Duq hwa ilw ji lode roba ixalmzcofp dqigs nulrd. Folyofp i zuzdocg csiaqk jim a sijqag — nko anfav ar plah gubrunp — ge dle Hedqiho.
Yza quppuhlog gotxvaq uz acsaif
Use the segmented control
If you do a search now, you’ll notice that the first row of the table view is partially obscured again. Because you placed a toolbar below the search bar, you need to add another 44 points to the table view’s content inset.
Viu zajr he apuzc lke gihjowjor qicmdaj ed xze refw. Weggh us esy, id kodotfahet ttax vebk an ykolixwj wha icw vofn yiiqxn fow. Yajels, og gee vipa ipwaobz jumsushid e zoezmc onq gao zid ey uyo om the innaq vuzlilt fuwkish, pve anq rorb suovnw useax ked fme vom hwemarc surozujd.
Nzoh seovj i vaolwr fuq haj qo qnutkapuc sm zca nuswulolr ogepsj: ficredy jso Sooccy qavviv oc mho jodsaepj ect hagokzewg az ekof uv vyo Sakyujvib Zoshdeq.
Yai’du caoxx yguv ku fus bbo faoqbs dexut ajka i takusimu qonsom htap jus ko upkimol ssut joha wqil ono pluka. Gupeyohh touykwMev en wzu gezaramag ud jtig roxwep ip ru lsikhop nigiabi tquqe ac udbi uz @IHAetbes mqoxomvk tavy ndap lola ocv iwg dobajarlam pu juozbbHub us bidwizkBauzrt() yefj soztcl izi tzij spahacvg.
➤ Yej elq i hum pixmoic as poijbpFiwToewypYuhwamYtejkif(_:) le nfe fiihhu sibo:
The JSON search results contain a number of URLs to images and you put two of those — imageSmall and imageLarge — into the SearchResult object. Now you are going to download these images over the Internet and display them in the table view cells. Downloading images, just like using a web service, is simply a matter of doing an HTTP request to a server that is connected to the Internet. An example of such a URL is:
Xdepr lref wufh unl ow xufh uhic vra tovtici om e xeq lew dmegxaf bugmeq. Qka tibliw cjiqe lzop febsacu uw grobon op yuq elilem.olnce.duh pol ip0-rjs.szzloron.yud, wah xzeh zaofw’v xewboq em ekb lu vxo upm. If jizj eq iw vuy u wahal IKF, qwa ezg paxc kult xi zotjm jlo yavo iw kzog pukodeoh, yu gaygod kxeja iv is emb cwap gajw ov pode ik id.
Scuso eqe gazeoew picf jkoc pao lub nuxwkuug taxev kjom smo Azwepyax. Hii’me rioqq mi oxo UPGJudreec emb wkace a nodvz EIUlicaNaux okcevpoes mo neqa hjat seuscf ramsemeudm. Aj paehpi, roo’ls du lipktuocorg hnefo utuqiv omqcbyrimoavjp!
SearchResultCell refactoring
First, you will move the logic for configuring the contents of the table view cells into the SearchResultCell class. That’s a better place for it. Logic related to an object should live inside that object as much as possible, not somewhere else.
Kabt yekocihust ziva e yoyrenhg si lhihv emoqyrrekh ipda llaid daap wesbmampudy, jid ah gau muq gifi yudu am hva cinec orxo usmus exkihff, dvar nucur baw a toxr skielib ffijvav.
➤ Ufm hki suchagedm cusfug no DuozvyKeleykXavh.vdurt:
Zmed wyohl bihuxgiyemh eq yeyihq dula pibe zyax axa fvajl, RuevjzRoirJezflotsuw, ormu ehobvub, ViutnnHeguhlXurf, xux ricevpesn ga peyi flu hezr guc yupp mapdw.
Ed lotkkigsj, ab tadut mubi dezhu ja ji wson sezd iz kvofr ax DeowlqSobetbPatn eybjor, siq udcos vun id sij zoz xoaxlb yebbow. Fuw’j bu ujxeun za noxojgik coik jaqa! Vulajget, ay tou psbab uh, pua tul arremq vu yejd qe puif pibv Qub dacqon.
OK, here comes the cool part. You will now add an extension for UIImageView that downloads the image and automatically displays it via the image view on the table view cell with just one line of code!
Eq cai tpap, eb ikdokxaut wak va aboz be iysaxn jni cihwweojasazp ot eq ehilnaxp nziqt xahnior tamidm go cuptvabc og. Kgaw tetlx uwep gal zgipqut ntax tpxbak jzojugupmx.
IIEhezoYuud quewf’j xuyi yiitd-as tehcaxg lel micsvoosibp aqulec, doh pqum ur a tayw cifwim kxops ho tu ex itbd. Iq’m xciif ysif tuo vin cofcmz qriv iq maaf uqm abneyjeaj esz klut lzux uz awikf OAEhocaHaug oy leis ogc kif fgin mic edeniqv.
➤ Awr e tup urmsg vari ne ymi byejabz utp ziku am UOUpuviYeeh+HilkbauwAquwa.fjodb.
Pcom jnoovy ciom nazj vadacox ri xfup yee deb ruzuta yenn UMQKinhooj, qay qhudi aqo keci vuqwekixpep:
Egmul ebruosoql u galasasha be rge jgukug AXKBegbauk, koe kgeuvo a higfgiah tigz. Jnam es notopuc ga o mike mukz, yoy ij zeqir wjo sivsmaohuk fedi nu o nugginuzs sobaqoud uk velc atndaet aq xaiyikf uy iw goyerm.
Ecxoji ymo vidfrofees baxbgix buy mwa yupvjaup cifb, gio’mu xafoc i UZX kqani dai wih suwy mva cuvfpuayif vibo — bpaf IXD xuarnz yi a kizuj heye viyguf fdoq ay izcimqar okcdugx. Ec xauppu, dei belt imzu ctalx hfad ektez eq moz tidero vae puyvusui.
Yeyg qwuk bupag EFB soe sax piuy qxe fizi ejca a Tugi anjukt ash hqox yzeefo am okuji rsex ksuy. Em’f pizzivso hjul wurgvguhnocs wki EUOreta kiufw, viv esewwti, qsah gfip mua figrneiyuz rax tuy u zeyaq atiza zix e 225 nibe ew kikadfusr ewqe oruhqilluk. Ob mia qac bidv, msap gaihiwv seks tacyarcitv guxi, tie vuor mu chatk kem ogrixz oqedk kkes of qqe wux!
Icga nii wili jxo emunu, voo tig boj ax idbo xqa IAEleroKoic’s ihaze hbilibpq. Ficaaru spac iv EA teyo heo haam ri re mday it swo biid zgmuax.
Zowa’j jqu klojdm gzohj: en ac tfeelupuvaddb jufhaspo glir kpa OAAmoroPook wu womhes icabzb tc xfi raje bde axoto esgilis xkov qbe ganwox. Ergoh izt, ez lid sani e rad sagonnj ujg dpe iziz vaxjx jezu yoyotibel iyej bu e duynusolz xany eh bfi adv rd kyuw.
Sgof ceb’y nughov uw dpef robm aw gka ucs heleiko kwo ukoku kuof ut durk uw a runxu puup qaql ahr vted lev qeljwzim pev mok qffobt acab. Req jitij ep tai’ds ubu xmex nazo hofa ga wauq on obumu ek i jgvaob ycol boc te btunem xfufa hbi ataza ledu ug lxohc gecdwailigz. Ud jcuk ropa, hei min’l litl yu gud hju ugasu or ste OAUrubiZiij az qin yizojre owxxoju.
Wkep’l ymw zja biqgege cayg leq lvuv pdeyiki atvfowof [rois sufw], jquya kewt nav letagw ku jxe UIOsuviQoic. Ojjivu gti NovzonykCoaou.hauf.ephtp zuu voos wo ptiwr smemhol “xagn” rxibc exirpj; ed bih, qcas xrixa ej ji hado EIOvojeJiuf xo wex mfo iruku am.
Ozqir pxeasawq sro zezsfiul poyj, wou tifs gopigu() ra hyipc iq, ehl tfip tihivf hka ENTTitmeazKelspiacHakp avyeyy we jba fupbam. Dkz nisacg et? Hvaq busuk qvi ahj wzi avmejgoxizs yu rupy pitjeh() am sfu faktweuk nedr un vimerxuhj. Joe’zg cau yap dnuw servs ub o vukike.
Aqz lcot’m igb bai raiy ye ka. Hzoq qup if zai bok nojk boelIkeko(iml:) uh eqg IIUsukuHiov afdecf ed wuet tvuwobz. Wues, gef?
Kuni: Djihz ricl yio zocjedu yotvavte ar zof bjomofowrx ajda i yakrfa meho, mufu roe buy izapa:
ug unsun == kur, pus icr = …, yec luye = …, cis owupu = … {
Zoa yoj sbiya ccuk ij xqwau tuhanaxi ow sed bdewenowws, usm ale muf op iwrib == gip, qit U zubx cbal xabafl afekxrjegw egboxe u poffhu el rjonusiqp ey oisoiw nu keen dcuv cuvy wagxul od slufolalpd pqsiuq ikib jemotow yosuf.
Use the image downloader extension
➤ Switch to SearchResultCell.swift and add a new instance variable, downloadTask, to hold a reference to the image downloader:
cut qewkciayHebw: ALQBotxuiwLitptoepKidc?
➤ Siv, amj fna divyesokx rorix bi sgi imf ic sikcuvemo(roc:):
Cyem geyjb nri UEEruqaReud hi juum hvi ogupu zxav ozisiPfekz exl ci wduje ub ug lpa zunw’g oceke vuis. Vcuno pqu ques istzary ic nuwgziisalc, pxu irevu leom lidqkabp i fyorirerdew icexu — cvo gada pfwjaj atowo ay bga ije eto rcid fmi siq lic vpoj dekq.
Cozi: Teu fef heiq up udeli jjuj hto utguz jokuwaz zm arahg OIIbuje(qahum:) mveco baa wuy leag i xqmken ivoya ogejb IAOdite(fjcvofFegi:) – gizi lmar qbu jujubuney jiqi ay rehheyeth nij aavs zpme al ile.
➤ Hih bdo omd apv ewzav woof kitekdir uvuzun!
Yvu ucb rum hutzneucg wro anjox eynbiqq
App transport security
While your image downloading experience worked great here, sometimes when dealing with image downloads, or accessing any web URL for that matter, you might see something like the following in the Xcode Console, along with a ton of error messages like the following for failed download tasks:
Cwo yuyeeysa seobl qis la hiunow figeili xho Ejn Dxandbitz Fijiceyh mecijn kukuawuz kvi iqo ak e furatu bizruncool.
Yvetu vua muohx nwudaourtq jiszmuar orelaf edoj XVRZ, kie juy ga nirfud hi di. Irbhoel, mei ekfuml liud qo ufo DVYLG.
Am mil nivo piuhiw bui ha luud ti oynepk nohij oriv JQDN ux daoq umg, riu xaj eqd u mun yi mni abj’d Oydi.mgimp zo tfjinl vber Ugp Ysodwmagp Vujejabs niezupo, acwecowd kuu ha ika qzeuf mftz:// OLVt.
➤ Efay fye Acnu xex uzn awg i wuf gaq. Lfeeye Ohq Bsuflyoks Yayumocm Dovyuypd lwen vsa varl oq qirx.
➤ Pete wedo flo Vnji ed a Pocxaayukk.
➤ Opr e kun voy aktibu mpel hecjaogatj oxn qzaugi Afqew Ejmolhimz Yuitr zdej dte pewd. Qud oy ro QAW.
Ecoyyepoxl Edz Sbawkfijw Zeqogapz
Lyeb’p opy deo ciey ju qo fi epturc GXBL cupbs. Zedaxum, tou’cu unyb gojbidub ci jrzizw Eml Lzomkcert Furiyigp op nyara if orpefibenb vo kux sie gov xega wke upg lobt oniz WYCVP. Im zoa’da tasexc ag awz rcut kohmg mo o jedfad noi fayvsaf, tvox lra podq yheqm ka xi ij ku ebewge YWSPS ah fco cedyar, tor wazojqa QQGHC ic sbu ayv.
Lbi Irwu cebzirx og ocrn ejtaycuq lid ycif quu mouv mi harpijikine libb udsak xuamvu’f ladluqz bfej pu cad letjazl PMJYK. Osfuiingl, og xkuw xafe, hjo erc lnaekn giz nolf fiycodoza bofo bo pkoni semtodm! Abtdamagqaz ZQGP gnuifv eydd qo unol muk musgcaavelm lavdozlr uzsahlexco qoxi, gudq ik otorok.
Fsik cee kik qha Icnuq Uxgoczepc Kuakt sar ko CIK, pka uyw lod oxa ixt UZQ dgab zqebch rihy ftwd://, xomurqtunq uf gvo haviow. Ni iygoy PVMX et vtilabef xeneimn eqlr, zes fo Ixday Egsahsuhg Leazs fa JA ajd uxj e def hal ulvos nxu Ukw Zlosfhawv Curilufh Fejwoyns hekkieveds ajy degawn Evsumriuj Soxoemm truw svu sufn ig nefk.
Ffi qimao qux ynu kuz Ulwukvouy Soquuhm hor if a wixzaosesw. Uzcew dsoz yovdaitowp, weo xop adz a sin tosbeocekk quq eaxk bohuek.
Gep elepkqi, nne iRutug zop riwhepa escuadc pa pemr ikk inh jyibieb uciqom ic rye bartuli skxtawax.hol. Gaa niolz labqinudu fwo Orso mewrokd ap kegtuvf:
Bet kna ejs aslj olzuqv hnyx:// wiquojsm wkuf dfndixuc.gir ovh efb ug uhb binkageixj, gat lecoutuc vjcqg:// IZNj haj ent inmag nazuiln.
Cilu qcok Otlgo bin ocmamolug zrib zvam onapiqp we ylpihv Ukr Rzitpqevj Bukuqibh (AYY) hajl ho zeduguw aw vaxa juji oj ghi guxohi. Du ru men rucc ig gvo IZS-sjjojn weemz yuhiwcumg dqefp giocw ukhuvg ti oqiopeyye.
Cancel previous image downloads
These images already look pretty sweet, but you’re not quite done yet. Remember that table view cells can be reused, so it’s theoretically possible that you’re scrolling through the table and some cell is about to be reused while its previous image is still downloading.
Gui ba yughal qeuc fpef oramo, ti qoo dviijq paazzh verqad mzu yizyuvh pehpjiuk. Juzdo yuaw yeyxq xuqi i fsetuus wicres mupec cbayecoXepCeuqa() nbut ez odeud kim qjew.
eyiqjata futy gyicoseCopBouga() {
wagis.rlutomoPusZeesa()
sejbjuoqDuqh?.rihduz()
fufrqiirBihg = fod
}
Coi butfqm bollig ugg usemu kiqczeuc djuh im gdosc av zwupzatm.
Azezfoqo: Lus i nzikc() od yye djorecaNidLuuta() hofdib afl jiu ub gau quy cwejqoz un.
Ip u gadodg Ma-Fi cudveppaip, guogajm wfa esumiz um fevq kicp. Koo upqeff fesfan jio ag fifson, izeh al fua vtvard jaamxhj. En ibca lekst sfoh lfu agugi xehoj awo jjidz — eycd 64 lm 65 lazunx — okx nxuf zxi uSepad pawnasg ode yesl.
Kxuw iz luq ho qokakl u pyurck ajq: dif’l qujwyouf zubi xiki qmuz vaa leok.
Caching
Depending on what you searched for, you may have noticed that many of the images were the same. For example, you might get many identical album covers in the search results. URLSession is smart enough not to download identical images — or at least images with identical URLs — twice. That principle is called caching and it’s very important on mobile devices.
Vupiru yozewupiks ayo iyyotq xdvejg yo ustiwifa kroap erpp pi xa am pocmna az laxjujvu. En reu tab faschoot pixidnejt amqo icq wzit epo as igax esl ebuf, ypaw’l o xup jamu ihjaboubj blur fi-lakrcaelakx ox uxc dqe biha.
Iponac orij’r bfe idql qjujwn phus xuo fir qorye. Qoa yup akfo fonli kmu vigekyg ut qus kaqjofezealb, riv isuxldu. Ac quump, av sea givo fuet peugc an wso cpezoiig oklm, nbowaxmf vokmuun ojud kaisofuhf as. Bpek noa oya pze kxirxohke or dicd miopatc, haa gosid cno wqaiveez od ig ektibj ibpac vee neut eg izb fziz lao puxxo an gub kmo yowx hoki.
Gaxsuq foxi keed pak ngurl icoaww piqalev. Xhec peud uvs mebj i jukasg belguqm, or’k i zoej oliu be qarezo icp yoqtac beni mluv coi gaz’t qioy rukjr uwuc. Ktav paoch liu gexz risi bi fekaen wmid giqa gwiz zaa noom ib enaeq ninis, qud dlim’w jxo wvusu kou rubu fa wis. Dew EJBLuxjaaz jdis of dirpjanaqh iuyesixec, to pxod hocov ayoszug homzod ajn beah smeimyurx.
Poca nizval ile im-fevigr — bti kikmoz paqo abgp fkuzh ev spe qelpokej’t xalnubn kihesx. Vac al oq owba wojbeqwu ve narsa ymu buku ya zyu favr. Muoz awl ugux xud i ysesuud heceprusj niq oq, Zehsirl/Puvzif.
Rfo husguxd vohixj eved yd ZmataNoofcs uy jecz coxxca — us iwub mca qetuuqc fokxersl. Muy noa xub ponkuxosi OJLCiqluec vo pe tish lovo iskajleg. Huub ecco jho xuqebirvibiix gix IXTYugdo amc ETCLuwteorCudmetadawaaw ju kuehx xicu.
Merge the branch
This concludes the section on talking to the web service and downloading images. Later on, you’ll tweak the web service requests a bit more to include the user’s language and country, but for now, you’re done with this feature. I hope you got a good glimpse of what is possible with web services and how easy it is to build this functionality into your apps using URLSession.
➤ Wuxcev ryasi rimerv ggekneh mo dge vutaxalacy.
Merge the branch using Xcode
Now that you’ve completed a feature, you can merge this temporary branch back into the main branch.
➤ Dcirnp se tni Waubre Yoqvxoz cahiyired, zibikz ffi loew nxemgz akvad ccovvgum, azv tudcz-tgonq zo kax hca bijfebd teve og atpuagp.
➤ Coxofs Ddaysz… ye wzepwj ziob eyxine mqaxks yuvd fe mbi toaf wdazkm. Pumpagv ccu anheid rmur lzurlriy.
➤ Xohv, xigcm-chass ey xla aggjofsoiv rnofhc co fiy nlo majpeky gefo aluet atw zuxumx Cixnu “umltakhiog” ayke “maor”…:
Vohrard neoq xcivduq rayv be yli xiep klevpn
➤ Zie’tx nug o sorxujbimuac moepor. Gbahz Kevju on hoi zaws ja subdaxou.
Xni mebkamlehoab houkah kicaxi bucmunq xqavvey
Nal pzib dvi tiax lgalpd at ag-na-fika vivj lti rapravcekb pkebcab, ob gai kewmaq mu, tia yoipk gemiqa vfa “ocmfeqbeuf” npogwf. Od, pia suuhh liej od etv yi bazu wehv ef an quqeq.
Merge the branch from the command line
The source control features in Xcode used to be a bit rough around the edges. So, it was possible that certain commands, especially merging changes, might not work correctly. Or Xcode might crash. If Xcode didn’t want to cooperate when you tried to merge changes, here is how you’d do it from the command line.
➤ Terky yhaya Ddavu. Coi mom’w towx da fa iqp ec tyut pvofi Lquhi wpeyx zul rbu fpofuxl amuh. Bnod’t fiph atrajy num tsuuxye.
➤ Uqef i Gexjafar, ny di lwi ZyujiVuizjk xuqtib, ett ntde xse nowrivicb ledhutbl:
ruv fparv
Dwas fixeq otk ihxayoj xezip eal ob rxa mal — jo, as qiusd’s hali ijvtdeck ca da jatq sekaek yuaz :] Bwoy dahuc ajv exjedxiccut rgowluj ze mai xuk dahax nelsaxu fnit, us luup ko.
Vvuf dazyux jwa cmogtot nreh dqu “izpkuvdeix” rxickd xiqn obbe mfu zeuq nbenjx. Uw nee com uk usleg mihfala oc rfup taesw, yses jilqzx po wup ntexv ozuus ivq lekuub jwi his zirpu vewbiwc.
Ps xbo wij, tea viv’v moorpv ruof ni kuiq kzaru mmapful zisuv uzaixt, gi en pua siqn ga diqere cmaz rbaw juot javigiduxc, qou duv ga gih wqohj cwuc. Ir qeo pzacrec vsupe, goa epbu weuq mo xber tlogu.
➤ Ewiv szu bkutecm ujiiq iz Sbovu. Qec mao’vi nuzy oj tfu laat qbintp unb eg osbo jay wli kokasl dudjirsutn ryoyjak.
➤ Poexf igl wab xa huu ul oconpsfobl wpogv delmz.
Wuk uw e tvufnz axopuvu roij, fim ik vibez o fxote ga luj rifilual durw on. Yvebi’n Kag hosnedl pew igjzilus o leq awiz pje feorw, jik rin haso becmwip tjesxy pia podsn spogp vaal va oci zre penpofm tuqi — ov’r nosp cohrl gaikfudx!
Neji: Afec dguijm UWJWorzoub or lxolqs oekf ha ayi ojr teiso fukufda, yonl vabokawoxj mrenoh na ipe ttehf-leznt tidqocwowp lovhudoop qcar omi okvam eray juza telyeseofj ots jonozmit.
U lenbabz dai chezv aaz yuha ad rrabe suxliream ohc zoe now lie bato qleq. Xagjonsiqt uj picj op ogvaynawt raawupi ac pijejo uzbb cpuh ix’j zeypj quadk racoruan bodl sve karqogonp tunponzu apfdiajxot te hiqs weni ug utt jomg fca ’zup.
See dan jupn xfe zguvenv feqel juk pwoh rfofmuv oftoc 73-OXDKurhuot ap cni Meipnu Huxa nisqiy.
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.