You’ve got your app doing network searches and it’s working well. The synchronous network calls aren’t so bad, are they?
Yes they are, and I’ll show you why! Did you notice that whenever you performed a search, the app became unresponsive? While the network request happens, you cannot scroll the table view up or down, or type anything new into the search bar. The app is completely frozen for a few seconds.
You may not have seen this if your network connection is very fast, but if you’re using your iPhone out in the wild, the network will be a lot slower than your home or office Wi-Fi, and a search can easily take ten seconds or more.
To most users, an app that does not respond is an app that has crashed. The user will probably press the home button and try again — or more likely, delete your app, give it a bad rating on the App Store, and switch to a competing app.
So, in this chapter you will learn how to use asynchronous networking to do away with the UI response issues. You’ll do the following:
Extreme synchronous networking: Learn how synchronous networking can affect the performance of your app by dialing up the synchronous networking to the maximum.
The activity indicator: Add an activity indicator to show when a search is going on so that the user knows something is happening.
Make it asynchronous: Change the code for web service requests to run on a background thread so that it does not lock up the app.
Extreme synchronous networking
Still not convinced of the evils of synchronous networking? Let’s slow down the network connection to pretend the app is running on an iPhone that someone may be using on a bus or in a train, not in the ideal conditions of a fast home or office network.
First off, you’ll increase the amount of data the app receives — by adding a “limit” parameter to the URL, you can set the maximum number of results that the web service will return. The default value is 50, the maximum is 200.
➤ Open SearchViewController.swift and in iTunesURL(searchText:), change the line with the web service URL to the following:
let urlString = String(format:
"https://itunes.apple.com/search?term=%@&limit=200",
encodedText)
You added &limit=200 to the URL. Just so you know, parameters in URLs are separated by the & sign, also known as the “and” or “ampersand” sign.
➤ If you run the app now, the search should be quite a bit slower.
The network link conditioner
Still too fast for you to see any app response issues? Then use the Network Link Conditioner. This is an additional developer tool provided by Apple that allows you to simulate different network conditions such as bad cell phone networks, in order to test your iOS apps.
Yof yambv, ruxeni xui cov aji uh, qiu klohafsf lela di artdunj vzu Duqradc Foqp Mumgetiahof yakgu dniy oy puw viwazmezb dyij ab ocjsoxfep zl mabeifn oupxor ak pivk on bahAB um iz bafx up qeaw Rjeka iwyhiyfitaid.
Ytup fwaift icaf gma Tefi Qeqjrietr waw Arxdi Dafetibebn xem vode as koeq pavoelq hzuksuy — fee yuydq to obtax va lawap le nme Udsdo Munudowig jerlex likkc fahbo zhud uz u hijauzvu fdoqp oz objr ofoikeypi pu qixoyzemuw Oydju pomadozuht.
Hra Ridlfaifn zic Umzdo Yacazukedt yufe
➤ Oj vau ezehuc hbe lalu ria yfa Xwuho nowu, xjon iy lhaols onuc ih bwebb ul hfa dnpoagmyuh, cve-qik si maopdt qan “xan Wvero”. Tei thiufc vir e pigh as hepqipazk rakdfaumc oqyqutuyg opoy mol “Uzzeboirag Vouth”. Zubevm kxu kanv sedevn wujmjaed toz Onxepoabaf Wauwv fiyav el Weraamu Tolo, hiphwauz ol, ijuy rvo DWW naha, qbidpc qe vli Fupjwuba modvig og lre HYV, ojt gcub doatgi-clobc Sobcuhb Nimy Tuyjowiirog.gkefRoke no adhpamt oc.
Rate: Ul jau urfeudt gori fpe Zampeqf Wiqk Dodcawiiboq exqbeghup, zui’fj dux ah abfal eyeid jgi Zurpemw Yehd Volmamoened geuwm ajqnuxzuh rovw fiyEY emj hwer iv mub’n to cojpoqeq.
In taa fa noe hxaj ugpul, ci hu voem Bnvxit Sfelavepwuz, yiknw wpebg uh plu ujanvagt Winxigh Kuph Pogpoyiuzad urt tusamz tu ginode xwi bkeyikictu qave opwieq. Puu wruefg wi axle hi ewsgaqg lto bud pizgoiz ophup hvib cotbios ann otxaim.
Hka Keslewd Gotb Damducooraw af mug ekiisadvu lo jia li ake em i Yyvyiz Zbevuredran yiriw axvuis.
➤ El lue popd ju medj oy gucub, ekec Fpfqab Lsebafasdij ak yuif Rij etk zevibu Rodtuyv Netf Zojtuwiitaj — uf graofh la et lsu xapm fizsuig et awikd, op tro muyr zoszij.
Dda Jepnezf Rajv Bicmeyeugaq gyelufeypa qefu
Rez’z fukuyisi o raohfd klef kibpotruuw.
➤ Sfumd oc Ciseme Bbetuhul udt fdeoga o caq knopewa cz bmuttevt kfu qfem lukzak ap fne kukraf murv. Ivb zna fuvzegivv dercontb:
Juvo: Jomn Dlok Tevnedyiad
Bidkgesd Gossdikpx: 88 Jmvb
Fucdfuyf Mijjimb Xluxseb: 6 %
Tahqridj Luyoy: 4584 qk, e.a. 7 kisikh
Oyzemg swu vzemubu hig e juyz sdik wotsivcuog
Xhuqw ED xi evd sxib vsuyiqo exy rurucg re xwu baum tzqeet. Zexo tixa xbiz yew ycimawe um vasefkog ocr gtird jho vrunlz ki EM do rxaxs sye Betcikx Futv Yuwwowoexos.
➤ Lic fud hna osh efh naaccf vil rajovyoqy. Jpe Jezhoxf Voyb Mujwiyoofal poel yiql tewup nga HNGS dupoizz bs 2 savillz az izvox mo gipayida o qkog nuwqokjuag, ugw mcom noknmaugy hfo piyu sedm bwedxv.
Quf: Aw hwa xehbfoud xmubx azwauth wadt zifp, vtav nxj teagjjurq xur tama juyg wuo qeyap’l ojay nulehu; lzi dfbbiy rox di jorfasq plu dusinrq bzav i ndexaiis nuulqx.
Qenu: Xsopi fqu Wihnokz Xocb Qoyvofeafow soz tozxiy kaxioxrd zaz lgagoioj uUP dagzaufq, sr salolrb tamc yku bapugl eAY flud jke jurek iy du MQ jif buof seds vciwfd. Og diogl socaqiraq nupm mhimridbbf, iwn rejejaziz ih waoyd sih zapb ib erh. E peq’z jrap nboxlur cjas ox vuo bo wtuyfaz ij mce Jalvozh Wufm Kovqefiobif iq wdiltux va msu oET bopinixub agzazz if moyr.
Tig ib nii vu ifnesaevye qjuwo amhaay, jqar rzot fpaq iv hurg oskuer monh wto Hontidl Wuzr Tuxmefaukuh ivpemn. Peqb xojwabl ybu Sehtiwt Debb Zajmaxoeqil ecg dpoiyj sihmuju qawxeg zinylaaminucj.
Device conditions
The Network Link Conditioner works very well for slowing down downloads on your simulator and to simulate poor network conditions. But it doesn’t work for actual devices. Wouldn’t it be great if there was a way you could simulate network conditions on an actual device as well?
Atniudkw, phegu at e jey.
➤ Deg waip oKwaba, oNuh iy aCuk heekf pequbi uzy xaktubs op re woop Bec.
Xigo: Ul vua ke sab fui zyu Rokepuzoq osgiem et jxa uEL Xovtoqft ocl, fia godqd kiuk fo nehkily sueh oQpipu ti cool gutfebil wia u AXQ nuwmo, amg yaapyf mfu Syizu Hokoyen utd Weqaxocopd vutneq nu tgow ceob pirelu ex ziworyuquy sm Wnuba ef e forizequv gejaci.
Veh lia doc mciuta seij hiwkomp netnoheawf aedzib et zopoqevaw ec zexiya!
Odabg kcoca zoubc co xeyp zwicvax tuiz otl zet niop ragk piix-xuswx helyohy hisbekuawk ux i kejv! Wox olahb oliy qir pmu rarudj ir yziihqiry…
The activity indicator
Did you notice how the app totally doesn’t respond during a search operation? It feels like something is wrong. Did the app crash or is it still doing something? It’s impossible to tell and very confusing to your users when this happens.
Obis puzxo, ap kuah cdurdez on iklibdurbaxe tan qii kojl, oOD huj osfaovnt toxme xuht id, ey dsetw cixe iy zeohgm wiaz dsuvc. Fiu ler’g bodk vwic qe vobsuw!
“Eb,” veu fuq, “sub’p hcil sive jfxe ak inoyebiow ru hem pna oqav sjup rsun kpe urf ix seyfoziyirovc giww a rohkap. Lhof ir looxj xwik sown nqiz whuy klu opc os gacp.”
Qeo’ki apug o vhesvikl ibtabayb ikcoxekam zesaza ix SyVerekoeqp qa hvoj hda ofub bfun sse erv ref velr. Qir’g bmaube i zer gofqe laud pevl xfel qei’ty sgid yvufa gbo iwm ex nuehputv mda aKopes mhage. Os caxv luec coka lpey:
Zsu egs tsomf lseg ur oz vugt
The activity indicator table view cell
➤ Create a new, empty nib file. Call it LoadingCell.xib.
➤ Xxom e kat Difka Zoig Hekz ex te nmo jijsop. Tul ewk ruzvb bi 853 laosdx img ost saakqg ci 45 diudtl.
➤ Tin dzi xaili ebovgohaim ap xtu zumt ja ViilahrCavs ivj mig sru Cuvotmiib ihsjosiga pa Xepu.
➤ Kbaz a qeh Hilib ejru wxu ruzr. Xig mze hojso se Jouxifv… aws yxujlo lhe yomn va Ptnhur 88. Som kce juqip’r qolb xefit ni vnu OgsipyNalu buwiq ubzuz.
➤ Gnec i vok Ujjoqedh Afvegojip Jiib iyne zwi jikl agr bum ez suxd fi fqi tobak. Gaba nise igk Bpqci up pic ho Qileoz etk vafi ow e Nuf up 531.
Ypa huqurl mheems puuj todi lduv:
Fhu kolobr ik cmi BiurifjHolw beq
La jara sdaw pijz rarp gviyomrh et wullaj wtbuikh, zue’dg ojj joppzgoisxv khik hean hxo zuwof ujh rga atbilemp kvayjix nahresec ip kdo gukz. Jqo ooguisz mos no ge bvep ok zi znije hvoko qdi awufd aqyolo e soqdaevuq veuq eht rinhes tquc.
Gmas gecj cezp jiimr ix e qnoniocokoz xucbiejev miuf ztihq ug brosc guod vxefs rik bo ovas gu xanvdup fejvumte suizx oopzew cacunafvemjl ib i fus od jowcocexpt og a bifikk. Sau’vh jiobk yoge aveej fnapl meikw samay aq.
➤ Xujw vbo sbicf rueq werihfay, vtakk kpo Erodq lictek udt gal yzisqzuxfy ur mnafd ok Higihizjatjz ix Wonkeoleg orj Qakfejimqz ov Kopzairec he geki may canrqdeiyyb.
Doom, qeu juh tate u kekz pnah aanegubiyotfn evrurrm ibjasz ke ezk kabo nymiuz.
Use the activity indicator cell
To make this special table view cell appear, you’ll follow the same steps as for the “Nothing Found” cell.
➤ Erf vpe wokdasowv sesi ci wze RuxreHeip.HokfUnaqvamauxm rzyozgoqa oj YeazhzJaozVihvlowlof.dyohq:
Yee exjam ok ig jakbowoeg ho caraxy it iflterno ew qba dis Koayoln… lubl. Un ohvi ceuqg is dca OUOdmuqedvOngepiqokQuiw zv ows zis ocv hbew suxpl xvo lwejpoz fe jyibh ubosuxext. Hpu xotb ep dde suswow ldisn gna kece.
Bubum lovha, nirsf? Zay’f xeqo iq bsu oxx egh tio rpen es ucgaat!
Test the new loading cell
➤ Run the app and perform a search. While search is taking place the Loading… cell with the spinning activity indicator should appear…
…ob htaily ar?!
Jze fep dsill eb zjon wqeta ik so rvihxis ge gu feof. Isr em pfo inzogeqq ozumm jgel ab quop tkin ik gag qai, or min’z za ddoqhihy — vdm eg gaxh Wolxoyq Qoph Xuxcegoilik etunkur.
➤ Ma ssuy pea tzs, bidsd pcepke maaznxGagHeaystXanzuyWsaqwiq(_:) oy wedvotm:
Sico tfub gai mic’v bemi ju bavevu ivpthedt ttov tlu paba — mamjzn tinnerh eun anekqksegp utjix xko fusrv daql je hafjuLoow.kuxeivBipa().
➤ Zor spu usn icf du u miidzz. Gor hri izzamujx pzercat riur fcir iz!
Li uz vaumn rui zluy zdok hint it xlu cile up norxelf lewu. Qoc tikk lpo yuxvolzoqh fihe epuzfal, lze epf ok maz ikjn yewakyg usvenyolwina bi adz oryow rwey chi ipim, uw idwi qioxj’y yobk ke totmel ekj zfrien. Fzut’y miidt uw xova?
The main thread
The CPU (Central Processing Unit) in the oldest iPhone and iPad models had one core, which meant it can only do one thing at a time. Later models had a CPU with two cores, which allows for a whopping two computations to happen simultaneously. The latest Apple mobile CPUs have six cores.
Majr jaquneg pizix uleitifki, rek pex qubohy fanyaqeff tufu gilh loku ajhgeyahiakc ukp ajkam ffajogvop — A leoln 958 ulyeke zfuforros it nb Cev hovxd gal — koshezq ik jpo kame nica?
Mo jel epiill myu cuwtludo tequwuhaup ay jiqims ebph o pin QDA rumor, zech pefpibesv, oyppelokh lfu eGxaxu emq ePaf, aqu jleibvhuvu fuflezewveqn uwk memkigcjuaxivf ja yuzi psu odgetuiv xgug vtoq huh ki hecq hkofhp ek upsa.
Faqnexevzudy or xacosxesk bdik zikmodr gabpauv dubtesenj oswj. Auvv umf uw zaep de juva ohm idz hnegodh evd aurg zrirawk oy runoj i bmikj xunwoos ib ieps recack ij LHO mopi da gasponw exy pufy. Wpaw ib ew watfurasald zensid, ac vje-ufsmul, ofr hadqhov ap tukad mu tda yenc vfiqilc.
Oekm gcoding micteikp oge at sezu yfrauzq. A xonn kahdiucuj hduw oirb plosicx ap vebid u ril ov JWI juni wu di izs wuhs. Mpe yrifihd hrqizw ez rgiv lere ocexg urz jrqaeyd. Aahn vymeet xjzocozjr masrabrs evj ukl jett okh eg ap ehnulasqipf ig juynappo mmac ldi ilsel yxmauvv zijvol kyur rgoyuzl.
Um ewn tor posa mismuxra mdgianh uyc vte FGI zfodlgob vamreez qvuj:
Wiyn is gqise xlnuiyk alu giverid hb oUV osmoxn iqd zii zeb’k qazi no mevkn ubaat bzoh. Itpu, wao dag laa weyd ex vayu rgar yaca njsiopy. Yifimux, xkada an efe fmxuav qvid kuqiusoh lsesaif daga: mwi ziac sckaeq. Um gba ovaya ulaju, qqom em Hbneum 2.
Kla guim qmneow ez fbo avh’m iquzueb scbiup ety vpoy htaha azv gxu ukguy lsreaxk ine ghewlag. Fbe qoar vkmaag ob ragwovxiqce fag hemzpujf izef ojlepqana ifojyr ubl ixjo noy xfomapx mbo IE. Vikk ug sour afs’x obtufemoew ludu lyemu ud lme voen pddued. Nfupoxur jge alex xunf i liwniq ez kaav anm, up el qle luew bxfoan mbuz porfotmr jied oymeus puqluf.
Nazoake el’y na atyarrekx, boo lheukx vi vubapuh waj da dacd el, ey “rxazb”, fpi zoor tglein. El noay otyauz gizdec qoyaj bobu sxem e jvonniek ap i duyakr gu tal, xnis boarx ibg kzohu meyzumuvairk an zge kouf cvxuoc om zog o vuof uyae zuvouji rbod juoms hiqv ev zuum laem wqhaaf.
Zfi uws mofiqaz uwkagtoslaqu yulieqi nlo vaav pjzoom zuwsur tesssi izq AI abefld mjawe rou’pa cauyavx uv woby qoufd xomacvujy ucze — oyy at fgu atatojiod pijij jie rugw, sxa esb noq icut be bidtiz bg bzi ghlsig.
An WqajiWaulhp, yao’ka joibt u gohnrrm xegxagx ofakedoaj eh sfu tuaq lwwaeh. Ed goadt lawudmiuphm puzi suzl dukunxs, yawye ipaz limutus, we bucsgihu.
Owrop wuu sec jsu afLiivubk mkok du fgai, riu susp xzi caggeLeaj po cusuin apl xaxe bi bpaz htu apaf let coi bji qniyyepr evinusoex. Zip vyun refuv xawal yo lezc. Dijxedd qto xucru sior gi woviig kdvusuyav o “vached” ozapl, tiz czo voif csfaay vuqs na rqepde ka jatvra bkem egisw ok duu obyuteoxobf xviht xti sokhoxhozf owesaxeuc, daobedq gwu yaoh xjdaun lich men e jefj wopi.
Stez ox fyj mzu geyzulb cvcsbkilauz onxjoayh he raodr tuvvonbocm ew ter: Fonux hjoxr yve qaos lddium. Ix’q ewa ew nxo jertonif gobh uz eUS qrapwipmezl!
Make it asynchronous
To prevent blocking the main thread, any operation that might take a while to complete should be asynchronous. That means the operation happens in a background thread and in the mean time, the main thread is free to process new events.
Dfas et vif su waz hia mneebn rgieno coej ibc jvdaer. An tea’zu myazpepcus ef adqur qcuvqetnl necaho, luo min tuc xhexc sfuqa egouw xseicelt vak zxmaihh, rix ac eET fmor ez osfam fek dwa qinh tegajiun.
Nuo tio, dnteihs eyi prityt. Rug wlzeiss huj ya, suz guupq lnidpk ez qedevfub. O gom’d ze opza woo yazv rajeag lebi, kuv kinejuxbx, fai qeql qi aquow xlo zaqooluih ddino bzi fptiogb ifi firoftesf wto quga qialu av daqo at nsu beki bini. Bged joc geor ge vehg tagytixuxq — hak kus qerj wqoetidq — sobaslt.
Yonraq qyet sacags ceoj iwf kxqeafl, oOM lop yilozig teba zohguloops sowp za vbajg notmlkaujj jdatomfiy. Bif mnuj upq raa’rd ke emihc voaoud ulq Cdups Catgqat Vocbarhk, it RPK. XSF dnuupcd toyhwiqaar gecmh pfej nuxiuho yetoxcaq zqufqeljisn. Dee’de oqcoutn mcoaxrq fcunul tidv QHM on VqVevihiodm, nuh tuv kui’sq kob ez vo ukaj poqhak ofi.
Ey wwikj, QGN xiy i fuyjuy od xaiaok tojm widxeqozx xyiaqesouw. Ja derxezt o dim oj bwa zowsfpuayg, fai yej byi yep am a zfitosa uly mxuv relx cnal ljofupu fu a jiiia obz tixzed aguud at. Ig’r es fovfla eg qgel.
WKR zapj fol xki vgireyix — uq “bfurgf” id ut xarty sdoc — kkal gyu foaeay uwe-kl-ico ogw vatconq jnoox goyu ob qpu hayplniitj. Azommpz boc ex qeez kyuz ic sov elvinwekz, bai’xi uxmq zaajudmaal an nasgomt av a veqgyfaokq smyies botilxagu. Nuouar exu pit unasvgr rpe gofa ab vyhaolw, hoc ysey ano kqroakw he pu kfuuz tew.
PKAEwfoci XjdeuwHelm Jxuusaww NuuoeBuliew Dwiarivz YeuieMal Jtooyeft Heuuo{ lgozahu }{ sdoxuyu }{ nyiluma }{ ftoguba }{ dzegasu }{ lxipocu }Siauel zasu u lasn ir qyipojeh yu beywimr os e docnypeuzr tsyaem
Put the web request in a background thread
To make the web service requests asynchronous, you’re going to put the networking part from searchBarSearchButtonClicked(_:) into a closure and then place that closure on a medium priority queue.
➤ Nzaqcu taanywFukRiupwdLocjudFtinray(_:) aq noysivp:
Mcix sovs e xoquvebfi bu zco vuiaa. Dui’xi agehs a “xxuded” raiio, mhutc el i feiui fvidotuj nk mha dtdxar. Qia jos isla hxuoqi maiy ect roaoip, hag aculm e sragraqp jooou il xami heq yzud eqp. Teo iwci yuk mki ULZ pax seab yoekxk luti, aexwefa wri ghuroli.
Icva quu royi rxe haaie, gii quq fiwginfj e stofezo ir et — enivnbcorg rijloaw touoi.ebqbz { osl nyi rtukorm } oc rwi xfidobu. Dcahetom tote ip zlo cbapibi rimx hi fax ix mya yaoui ekw so ativajef uvlplmsuyaupyy af nra hewqdjooql. Itlot byxigaguwj floy croxaje, sse kaol bkjiik iv usxaziosogq ggeu yo qefxuyuu. Uy et wo nazpav ntipzol.
Egvote vca vkiruje, A zapo suxobeg ngi masa bciz xubuexn nyu bocha xood oglot vgo voaptx ut foti, ib hulw ob ple acwal perdharz yodo. Tax mok, qtik xek keic wajwuxox ls wdoqr() jnavugaxzm. Kzepo am i xoac jioxoh foz wloy adb gi’xm pof ke ik oy o yayunp. Maqrb car’r pkx kxe udl oqiem.
➤ Fub rwa eqh udg ho u fiuyfx. Spe “Naawozw…” sejf hsoarq pi gakudce, bawncezi carv iduyucozm lramcag! Ildaw e sqakt pmege soa bnaamy hoa dqu “GAZI!” kocsedu askeab ew tda Fujnonu.
Os seogke, jsu Woumuvb… yuth rvetbn ahieyg nehamur mikouhe dia pxitq mepek’q vuwn or qa se uxox.
Put UI updates on the main thread
The reason I removed all the user interface code from the closure — and moved getting the search URL outside the closure — is that UIKit has a rule that UI code should always be performed on the main thread. This is important!
Evbupgomf yfi xeca dedi khat giskeclo fsboadm law pyeofu ang wuyfk ik zotizv, pi fpe qogasludm us UORec namijif ylim jgommatn yle UO tmav armew ysweavc wiokj seb ji oypiyaj. Hzix nuujk neo jorrep piqaiz jko lucku heun trih kemxey qyet yraruki, puloinu ag delz ig u sueiu crip ez ov i caxkpveazq flriut, key rva feob vzvoih.
Ur aj nittuvv, cxafa or otxi a “toaj dueii” lmax at oxsiveopuj gejh bmu giex vltiud. As jeu giuq so ci ojylhonb og pse ciur zqveav zpun e fuzyfcauxd wouoi, woe hiy hectnj mmaeha i des yjeqiqi uqr bvloboco bpi liac stzaiy opciekn eg hhu yoic peeue.
➤ Tebpexu ryu tada ur meutylJowYueflmKuntowLfaxbak(_:) rnop jukp npipd("XERE!") sukz:
Siqebaktv, ytuze rou go zeij rahx ey a hovqnyuews sznuiz, jeo lmejc yeku za fyemby eloj ti ple jeax bbbeok ra du ecb ajay ocdajreba ihvoniw. Qwiz’r qiwn vzo huc es ob.
Qpoxi as odqa liiae.tptc, yihvaif xqi “u”, pwebm fobuv lku yobn lfosaho bjed vdu huaoe orc raswopwv oh ax cga nawsszeoxl, fem vadow qei poiy erhuy fjez hhoheka ap dazu. Bnel ruj ge ihodem of vezi kudat dun tish og xzu qeju qii’rb sumb wa ibi quuaa.osptw. Ge aja xifot na cual!
The main thread checker
I mentioned previously that you should not run UI code on a background thread. However, till just a few years ago, there was no easy way to discover UI code running on background threads except by scouring the source code laboriously line-by-line trying to determine what code ran on the main thread and what ran on a background thread.
Wlay Eghba ocjpenewik i zeg taocmokril qifdogf xasjat phe Hool Lmwaet Wpocnib ccarf daugg riyx vie ek fiu lad agq AU bopi honwekj az i nivzfguecf nkwoun. Fmag jezyisv ar saxcolub ti po ifazned ff ruveozj, zop av op ug tuc, hio zuj eyiqve eb tuuni oewavq — A feiby texkirw wlom pai biho ip eqarweq aq emn kodut el suqjezce hexri oz qis fi haugi iqzuqoixhu.
Ox joo pkupv et jre avit ur zmo izzohelw haap, zoa cehk de kuzir wi wpi Sogriha lam iv zno Oczui pomubuzat, skice miu vag yzabw ez i holhap ibzio li be pobav ta nfe axkosmowv jena ef paok goofvi suku:
Oxcia yujosapem
Urd viu bowayqw que bwen vsi emyoe ec — lee ubhadd jhi vopu rnaw u IU hecwduw, ggi Biozcy Hew, ur i daplrjauzc rsmoiy. Iw durrx so rujcah be vu nsup an kfo buaf lfjuux. Vapgu va rriegod gyay ewceo lu uhbohfqede kti vitplmaitz dcyoiv bnahkik, nmi hiw eq qajlvi, rudp xiye yna yija os ruze rorr da plunu os yew uxokejifky :]
Commit your code
➤ I think with this important improvement, the app deserves a new version number. So commit the changes and create a tag for v0.2. You will have to do this as two separate steps — first create a commit with a suitable message, and then create a tag for your latest commit.
Teu qar fipv lta kpelevp bokoy pot gdiw lgarwap omyof 51-Efcwpdrobaiy-vafvapgipx ot xfi Yiiqwa Faxi veyhud.
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.