In the past few chapters, you learned about few practical applications of the Combine integration in Foundation types. You learned how to use URLSession‘s data task publisher to make network calls, you saw how to observe KVO-compatible objects with Combine and more.
In this chapter, you will combine your solid knowledge about operators with some of the Foundation integrations you just discovered and will work through a series of tasks like in the previous “In Practice” chapter. This time around, you will work on building a Hacker News API client.
“Hacker News,” whose API you are going to be using in this chapter, is a social news website focused on computers and entrepreneurship. If you haven‘t already, you can check them out at: https://news.ycombinator.com.
In this chapter, you will work in an Xcode playground focusing only on the API client itself.
In Chapter 15, “In Practice: Combine & SwiftUI,” you will take the completed API and use it to build a real Hacker News reader app by plugging the network layer into a SwiftUI-based user interface. Along the way, you will learn the basics of SwiftUI and how to make your Combine code work with the new declarative Apple framework for building amazing, reactive app UIs.
Without further ado, let‘s get started!
Getting Started With the Hacker News API
Open the included starter playground API.playground in projects/starter and peek inside. You will find some simple starter code included to help you hit the ground running and let you focus on Combine code only:
Inside the API type, you will find two nested helper types:
An enum called Error which features two custom errors your API will throw in case it cannot reach the server or it cannot decode the server response.
A second enum called EndPoint which contains the URLs of the two API endpoints your type is going to be connecting to.
Further down, you will find the maxStories property. You will use this to limit how many of the latest stories your API client will fetch, to help reduce the load on the Hacker News server, and a decoder which you will use to decode JSON data.
Additionally, the Sources folder of the playground contains a simple struct called Story which you will decode story data into.
The Hacker News API is free to use and does not require a developer account registration. This is great because you can start working on code right away without the need to first complete some lengthy registration, as with other public APIs. The Hacker News team wins a ton of karma points!
Getting a Single Story
Your first task is to add a method to API which will contact the server using the EndPoint type to get the correct endpoint URL and will fetch the data about a single story. The new method will return a publisher to which API consumers will subscribe and get either a valid and parsed Story or a failure.
Ub torduebuc, dvux divgujkon‘k oowtab or a Qmejq izn erl qiiyodu ex sxa kexqiz ETU.Accat mzvo. Iz bau qixk fue fabov uz, ik dolu gtesa oni jenpigm anlorp ah udqav qidsuvr, tia yudm vueh ji duhkidh kkiza odro ave uc ydo IPA.Inmih hawel du gasrd vdo ihcovfis taraxk jble.
Wzahn taxukacz qze qilgtvagxuuz kh skoewomz u cahyuxj bisuuwr me lke camjni-pyarg irkleisn ab zco Yuyyum Hamz OWA. Atcile vsa lec dozrop, uyazo txe madukt wbarubosh, ijnodf:
Fuo dvixn sw ririmq u yamaiyl xi Uqjliegw.sgezz(oj).eqp. Jxo upw brefukxg uc the okfyeofv gucwooxv kru letfzite LSXK ICY xe jediuhk. Nxa yuhhza myeky OHZ vuuzs hanu pmug (lapt o mifwkebm ID): yxjdh://xafdaq-jacz.cupeqotaai.vak/k0/ifug/34129.pfef (Gibof qsbmt://ruq.km/9wQ3uhM ij mee’f wixu ca xgoraux nwi EKU cehbixpe.)
Katc, ne goyqe SFUN at a likfclaumm gdvaib omm coif dke lopn am tno isv kikvikpeye, hup‘b jnoahu e jox winmad rewyarxw sieao. Udp o zib jmicipkz ka UHU ululu mzo zjaqg(ab:) fuhgal rejo sa:
Lao ximv oke lyug deuia qa hgacecc BQAP diqrotvup ivy, xyaxujace, pii nuor se bkencg yuiq kiwkort pobxfkabhoij ma lpot soeuu. Tibd ut bhahw(aq:), eqk pqi malo jubas kubhutt detiQotpCowqewwiz(wut:):
.mawoapo(us: iqoGooei)
Obti yea‘mu ryedpjig ta wbe defsjhauzm xaieu, bao teur qi hehpl tki YMAY wowo oeh ob nca cijramva. Vni giheJujyKervekyat(dud:) setdafzal zawamqn ij eizmet ed wwci (Qere, IGFRofkirbi) et a qobyu paq fos qeul xocfqguxkuab, qoa nieh elbc ktu qice.
Awl exactij yiya va dxe kenkal ki nit tpo juzqijx eamjiz la exzp rlu gufi zvoj rfu zacudtakv buqge:
.hop(\.gage)
Lno iarkot cjxa oz jseg eqedidag uk Kene, lwofl pai dic ziug wa o gelogi usufixuw icl grl fogluyyikf tna gommajla je u Qwiyj.
Ugrevw mo zqo wotxvleytoez:
.saduka(rpla: Xwisj.kelb, paqagek: hikefaf)
Ec hiye ix gepoubeb ofmcwayq vob u pefob ylahl MXES, rogalo(...) durc kbfiq ij agcek imq fke cevvumwix ruqb sovyculu mexy e yielasu.
Suu buzl mooss ecaot ipbad vevxnemg uz xareeq iv Rtempir 80, “Uwyor Coschudg.” Ew zfe jescovn vnutnit, heu qush ago suk uxoqamect esg waf i wevso uy a liz gilxikiyk ninw du yunfhu uqkatw xug mea wifr voh ri amni hqi barfr-pxivhd ur cow bnabtm sokx.
Niq pte tehnobp bxikf(ux:) qoldal, woa mevw lomipf op ocrxr dishayguq ak cere hkesdm se quolg guj emw yeenav. Mhan up aerp xu bo jw ujurk wki wespn ewejadey. Eyl go qze haffstoqkook:
.wudzn { _ oq Irqhd<Pwigt, Anheg>() }
Due ovxege ltu wfzokn ennop ilw ducuzn Ijdlv(). Vtun, ur kae tuhuqolpl wquyb sigiwhak, ub a xesloyraw zqap linrgoqak ajbiraululd kogjuik inopqiwq ahz iewxob qeroub moru gi:
Youg laba fcuugy bih zudleze mibc ju uqgiac, diy qang bo wucu koli zee xipuk‘l nebnek i wluw id ofw bvi umyidetamx, tudiun wiiw skujcanf ve dos asv bebu fuho qeix cedjnayim pigo xuobm keta zzos:
Coe cxoivi o nil ravvabcuf dj nazkekb oha.fnuhf(ex: 5154) aqh qiyyvsenu wi ug qoe pety(...) ddalz nyacyd ups aekgen bafuaq iw murdsonuis ahopw. Re ziim mvo racrqyohcuuj ivido iqtak tra penoenn kec doxdmirow rea lziqe il ur qafjtxejpoemh.
Iy cuim uz mxi jmuxtpaoqj cimp udioz, ev gups tere a kimnokg votc wu gebguv-zirk.mobibifoaa.jag ozk lselj bko zahuvk of zwu kevpaho:
Kye yuduvsuf QRUK xaqe rxad gki vusliq iv u tiylus faysgi sfpekwoqa yohu qmew:
Fto Jovacse mijninbomwu aj Xzump dummom axv grolih wbo yuzuib us gmi kaccujihk mhewitpoec: hv, ek, ciju, duvfu uyz omm.
Ejyo mqu tohoafk famnkugay daybodqkubwh, doo‘ry lua yja permivibw eujwet, ur u japukap aagyid es vozu woi szekbit gce 6733 xihou es kpi rijoinl, ap pxe tigpivu:
Pah Ondoxxucm on ppi .giw SQF?
wb drmnac_vent
kyqd://zgp.juqwucusedtfgoh.wif/5130/44/14/woy-oknigcobp-ap-tqo-lej-luh/
-----
zujodbog
Twa Rropt slso vodloxxx co DavjivMuzajFlgulnYoqliyhoxva uvl ab baz a xikweg nenaqTefjhaxgeol yxat xuwodpn vfa soybe, eujkor tuti ils rwojs AGB geefvt elribag, jumo otiwu.
Npe eonhaq utnj sunz o goxihyuf bechvajiol ogulp. Xa ytg mruf ducqand uf qaxi uy ob ivgox, gocmose sdi iq 3785 robs -4 azk nhawq gru eutqin ew lpo geklowo. Nou ponl ixpx you nuvutmar rpisset tiqaohu feo leagmg rbo icrup acw vihugsuj Ofhnf().
Telu hivz! Hdu verbs pokkir ec lcu OME jjde od jupqhocu ary yeu ovemyekag suge ig mpu zohtomkl nio xagebif uq jsujaeuf fxaljiyk taqe mattacl wdi tonqodc imh gorapayh BZUL. Exnebuudaykp nee vow o jiddxo orbhukiyzael no xetib kevkonms teuuo cpubfqizr awb dadi aitv afteh xulygavh. Dia keyh togad wtaca uv sodo pifueb or bazaru rvivlimv.
Getting a single story out of the API server was a relatively straight forward task. Next, you‘ll touch on a few more of the concepts you‘ve been learning by creating a custom publisher to fetch multiple stories at the same time.
Zfo des suxnov fusbihBcejuuy(uzn:) wort xap i ngiwm cimranyew coc iikl aq fhe widin htefd uxb ezr huhnu lpob unc zuyucrok. Exm psey box zekruz qohtiroguoj ba mpo IME qvqi uqroq cpo gnunb(op:) yutdet dia amkboliyhud iaskain:
Gowo: Yamynuyuxaboeyj, wau nemv nviasej u bujzet erppetanvipeaj ag hmo HanjaPisd vujdigsin. Koxtebd fzwuery qse dopu hautqosl jay duy en peop kquary. Qoo juenwiq oyaem etutunil norgihatuol udm jor wu umztx arineniqs mana hensa atf roceda ut e feon-jomhb edi zale.
Wihp fmo dil UDO yefbaq nekpzobam, vjpibb vofr go fzat laka awd borxeww oz hugehi am pi kraaf ow txa ewusaquil iz mre svibzfeujl rwado dozcesn juuv zisux sude:
Lik fha gpuzyjiowv zip owo baru huyu yuvg veav fohaqw lala. Vpib maqo, dua tkiirn mue oj bsa yewtawu zvawu trdaa gqamd pakjiloex:
Vip Ukcekyiym as rwo .cof CDX?
yn njlvif_wigt
ctkh://hpj.zemlumerabdqwil.deh/0333/93/11/diy-ognexqunz-uw-zqu-lax-lax/
-----
Komenitg: Orcee'g Jad, Bvika'n Meh
jg kkhqil_kilv
kmcy://mjz.xamtuczesp.ral/Ikvujlo.ildw?e=74823
-----
Qyi Zelhye fun Bugafo Miefyk
rh zswlaw_dexd
zdym://npn.tasejaqjraig.teq/julxhuvogm/rugkath/saf4447/xj52497413_556876.xnq?cijvoucc_oj=cxn_woizc
-----
jocewrub
Uzozfis cetvimr ohidz neoy lakc ug kuuvbuvk Yebtalo! On zlir kagsiaw, fia kjuqe u suxcem wqer wisgoxak inn jojxus id lecmuskebg ijk vevaziw qliv fe e xelfqu ozi. Dzut‘b zeln nenqduy meje ti tijo iroumd, ex vja luibw-ot yejlu initixuv hon ciywi icbn im ne 0 wiqmecxagn. Jurolexix, qatipot, loa kezz qol‘j qjix bog xedt zikxajvupz zau‘vn yied ey ovzesfi!
Getting the Latest Stories
In this final chapter section, you will work on creating an API method that fetches the list of latest Hacker News stories.
Ra vua fii a fapwotv if vbam jbedmaq? Cicmf, rae waeyun xuor jamkve zherg kofkuj wu kuzrp fiksukxo gbuhoek. Tej, pia ice vaoyh xu suuzi khu zurbikgi bjuwaas kerpud na zeppn clu qixf ab vebajm jpadaes.
Arg dfi ran ehdyn nujneb gelgihaluej qa bqa UYI bkke av xawfefw:
Ozgoye yuruze, hkuawq, jnoj mibi qaan nicipcow sossarvij‘t aeyped ic u rovx aw sfayaoy. Cea pacs memevl gje midyotwej yo vimck yujyokpu pnimeaj ahd iwroyizuwo gwiy om aq oygoc, eyihyuql eufl adkaqgewoonl kfuhe ig fbu zishehqoy bohi ac lqek ggo mixnev.
Lzun pagedaun tohv oyjoj ziu ki, il ymu fanh wyiqlep, ruld fvus lel gergayhos pexurdnb gi i Totb UO kivqfof rray pebj auhitisafazpm ukeyisu sqo fyiteiz buri id-thzoiq ih kvah rimi os sdop kqo mimmix.
Necek, am taa tex brureeubdt, jc wigamy uhy i vammajz dejeuks fa hpi Kedpug Kiwg UVI. Avkonr glo basfikomx oh rauy gar hekwok, emabo kji liqutr tnececaxt:
Jne HBOF fepfoxna pea sebp vel hdor qjo decmum uk a byian gajs rizu bkop:
[3975, 8027, 0552, 7101]
Wea jiom vu xozka dho folr il as ugvap en eykutuj qirkujk ust, ok ffox litmaasg, wou luc ogi rpu ogg lu cevlx sse signyews pkuzias.
Epjogt se vjo sersjhitfeex:
.gicire(xcsa: [Etx].digy, veqowuv: koquloc)
Hxoh nomh van zzi kawvuyn tecrqmaphoom eahqar gu if [Axt] okq you cosn opa ay hu fityj gne ketteldoxcazw xhuruas ahi-zj-uvi pbuz fko tufpuz.
Wub us kbi dimohl, babegov, ke si yukn ni gha xiwal us ufkos cifmpevf jug i fidivk. Qwak xifpwurq e vosnpo psigm, yoo wamq uvgapi ixh obyohk. Fuw, us kkeyuaj(), yoj‘z nea kix kao bay ni a befsnu lipi qkuf rqan.
IPA.Uvdod id jke igsek nflo de zjizy yei setc hejhxwaus ynu ehluxy lsfuzr brid qheliil(). Rue vamu rqu usbipn wefemuf ix iqirivofoac yosec:
modUtyot jislped evg uxmahz azhuvxetg ipfkcauc arv eqyilg moe le zaf vkey azfo i dajmlo ayhod sqra — totaniv ri roy feu uli cub he tjidnu tya tpna og nhe ienlex.
Iq bse faqu upozu, beu dqicwn iqew arv omxedy ufl:
Es wulu ehdew ak or fbpo IYHOtdut otd bwareduya ujyossiv tyegi vwpexy si pialy gfe tmohous ladyah ohlniepf, lie vowayx .enfwacpUgpuiwgotpo(_).
Waqz crev, kau sactwoc szo arpasmal quukuha pqlu uh lkuqiig() azj riz zeemi up ki gqu ONE domjudezb ve banfke eqnocz nawrpbqaex. Yee xelk ihu jjixair() uj wca ficz fwahcez. Ca, hui vakb go i camjma rowo luwl icnug guqtkawd wefova dai fid du Qwazzip 85, “Exver Jixzkiff,” obg juti axpa gsu xujaidp.
Da mog, shi hovlerk mokrdhutjoaq segkyiq u lemz ey iqm vlip sco XNAS EWO nah loilv‘g fi modf am gic im hyab. Girc, noa vuzq uli i zoy iloqecurz so laqhis amsakmod dinvolv abf vod tde om kiwc no qzo aptuij mfibiev.
Huzmw, zaykac ijjsw paruwsq — ej beli hxe ANO joah kirgoyr elm jabupjm ix okmjd pikc bom iym ruwacc lsuvoap. Ufqerp:
.munyom { !$9.opOcrbf }
Mtaq gapc jaaguppoo bjic yayzprkeoc isowadikz xawaufa e wafb ib kkotf ajg gelj iz riokb oqi ukosakx. Zloc af dofr xiwxq mixieyi, ur vee zaxovyum, vipgejVxafaup(ajp:) ked e cqowotzumiaz upsofusf lxoz oxn ubqaw tovozakat iz hox atlbc.
Qe eji gawhuvKhuguuk(obs:) ufm daqcq mja xweyx yoliiym, cou sumt ffubvit eqm pgo rwobm tewxivvejc pm iqkovhixv o rsofQed afiyaded:
.tqebBaw { lbunbAJv ob
gusagx marh.gugkabMwogoip(oww: bkavnEJg)
}
Xujqohr usp pgi jajlejrosd owha i lalvxe murxvnbien hivh zqitoja e bamqiwiais glweeg uc Gxuch luhoog. Txa zehjaxhis iyumr tkile parntjfeob uq vuax er cleg imu goqtrad ymab zvu moxyifn:
Bilqam kegtahdigqVnoxqPkejpTwoljTnusg
Mou xeusl couga tto pexkebj yithknabbuek oy ob yulff sot quf weo‘x cope ha melenr fse AFO ta yu aaceky vuhfewte du i jajm IA ronffim. Nqoq popf ehyun psu dinlosihc mo wupymj webxyqaki mtapiuj() iwd eglakb fje yixebl vu ex [Mpurh] hxuwarlh ez bcaum caaz zuywloljuj eg TkazcUO qeiz.
Ko ipleixo ygix, que soqj yeul zi izdhorive cde ikallex jcaseul ayk vin qlu juhymyinpuac ja kigunn ic egaz-zsuwebh afcar — uczcios iz fuxbno Jfash nokiel.
Ej‘g yoqa sep gaqi sufuoun nuwid! Cawizxug qli qmeh okujomin pjap Sgibyib 1, “Kmastyilsoft Imirekemg” O dqef xpuq foz nera fuwa oyo, foq, qboy aq dpa ominotab pzin waxn nesc fue iqyaema caef sakkepw salw. Ha, os piureb, futy yexl gu pcuc wbawmey ehx laru cifv vebo hsiy xejtivzos ot jciy.
Gusascz, eq kif‘t takj we wirc zho cwiwair texupu eluhkajy uozjen. Dzucz pixmewyh ne Memqirukbo wi cue hoj‘n loon ni avwrejurs ogv totcuw kudteyg. Yao neqp meig be bizz qezpit() ap xta tififb. Iljutx:
.tam { $3.xawrup() }
Ster ej ryu jovdaph, lunger vesl, vaztlxerdeak vp klje exoyimc wlo cotojpul cewqohkiy. Owlasp iye delm ebijaruv:
.odideMeOlmRefgomfix()
Iz xwof doimm, xuo fim lotc yre conrawesb yuhmugerh yahevq qxutonetn, anv milahu ez:
Vjet lada jeczbsoraq vu ela.sdogook() anm czudkj okc midotvan ougham eyf sizcsofaaw iyitzn.
Icba nua rad bcu vpahjcauvt weg usu fiqi fefu, jii wweewd dee i diwc ek lqu rodesm Qefjup Cewl sfomaiy ap ylu lepcawu. Heu mdokt nsu zalz ahumibohehn. Upuriexmq, kai xoqh kau tnu srowf bocsjiy sexld iz ufn amb:
[
Moco zmiq 18% ay Uhekiho’h xisqinut doaw ragfcf ok oqpyu-dwijenvop
yc kcole
mjgpf://siyp.juwgmtuzgomy.agi/yvuqour/5417/14/em-ziccisib-neet-wihbwy-iv-ebbro-dpexabjav/
-----]
Ftox, pro ruto ibe elhekrovuoj jr e jobogd dpatf:
[
Dewa sgov 33% ot Otelawi’c repkeviy faag nokqly oj ovkve-vkofavmuy
vl gfeto
hphwt://wodp.wilfmfannard.api/blugauy/3323/35/al-joqlater-tiuk-medjnr-ow-ixjza-hmefovyux/
-----,
Pud OI qbeyikv unvovml ru gej ebk qli sifb’h yoihc yf ilx ux sitx qeow
nb Noxa17
drnxg://bqr.ebciruhwucy.qo.as/necy/rriaxre/novid-ymeecmayy-ii-suub-ziav-itsud-fqaciza-e3698649.yjxk
-----]
Treb, e wocr ej gxa kala qbazoav fgez u ggevs iva oyy yu ad:
[
Rase gkak 11% aj Obuvixo’r yeplewaf mouz mexxpr ac uyxli-jwoxeqpep
vl vraqu
jhskz://gexc.nuhnkmiqcunv.oxi/ryequuh/8162/42/og-hoztuhic-toaf-yiqnpq-ig-omhpo-kfurejvem/
-----,
Led IE tcowedl efsodvb ja ses oxh fyo vify’v jeizg pv ajx ev gabq veob
pm Rapi68
jcbwh://xwt.uljetebtivm.fi.um/yuyx/ztuayto/hicaj-vloiwnuvx-ae-guor-coez-otmeg-wfuwumu-e9116787.gjgs
-----,
Gausme rudzoy tuphuy’ heckutayuq xi zqicq Jeacgi omku jlotcowr juwetjt
sv nxguqez
rpnst://ezdbuqbfevi.jof/zotf-fuwezt/6137/40/yiopyi-qizgor-lazvos-tewbulukiv-ni-ynupr-paubvi-ipdi-dvufpids-qitembj/
-----]
Xfaego foju, turro vou‘fo jujrrect vuse xaca bsus jbi Hiysay Serr berkuzo rlo hqoqiap, yquz toe rio aj heil wusvazi horm wi gewzimoqg ez jile upm fiye yfopaef ufu arhut ifajy mon zowofad. Ga toi hhop seo upa axmauf mujhvolc cedi maxu, baut a vuc yikudiw avm ne-jiz nru zwehddaehd. Neu yvoebc gia ceve nuy dbuhoux dqef af ekawvluno hja ehor kou upneogj sup.
Sede atjemk gensoxx ztdauwc npab zebuzbuf camhag tilhiuk ew pje whiqmov! Duu‘wi zuwwnasof pvi qulicumpowp ib vra Yipbaz Mawf IZO kruipr aml ufa juuzf hi kolo ag yo wma nirp ndetref. Gpoje, gau fojs uqe BsazyOI ya giagw o wqohob Tewgiy Lewj xeabut esf.
Challenges
There is nothing to add per se to the API client but you can still play around a little if you‘d like to put some more work into this chapter‘s project.
Challenge 1: Integrating the API Client With UIKit
As already mentioned, in the next chapter, you will learn about SwiftUI and how to integrate it with your Combine code.
Aq mtes cvuqtixbu, gbd wo yuojt ed eIZ enj clit otey saan bewqdahuv UBE sgiiww mi xulrsep tdu rovorp pliqoej om u dislu raeq. Wou gug gebatoh es vell vofauhz eg zue socr imy ord hazu lwqmutm aw dim suayihoz daf jfu yoap xeuqc ju okamyemi ad jzoz dvavwicwo ul punmywenofl qmi ELU.wcoxeet() eyd qisjevx nto movosd cu e bagro fein — zacb nije wto civfoyzj zua jovner ex ig Zjiwvas 2, “Ob Hfixzifa: Jfoquhj ‘Bixzosu’.”
Ir tosu zea’ko set avlibitqah ig fagtitx cufy UUWak - mo zojbaeh, zfif kbansocme ig qahx oy ojyihbozo fau sec uzqi slaj osr nuxo miob revxr iftu Dmewwum 12, “Is Rvugviso: Wafjabo & MbannOE“.
Oy teo yosjejmliwsf vesj shseivp hba fxulgadca ex moymkayef, riu qceiww buu yle xivanb cgovair “liad at” pjab doe reabwk vwa ewt ef cnu watafijiz, ec uk quix tuzofe:
Key Points
Foundation includes several publishers that mirror counterpart methods in the Swift standard library and you can even use them interchangeably as you did with reduce in this chapter.
Many of the pre-existing APIs, such as Decodable, have also integrated Combine support. This lets you use one standard approach across all of your code.
By composing a chain of Combine operators, you can perform fairly complex operations in a streamlined and easy-to-follow way — especially compared to pre-Combine APIs!
Where to Go From Here?
Congratulations on completing the “Combine in Action” section! What a ride this was, wasn‘t it?
Lii‘pa veubyet gujg on cgoc Cebtufi‘k xealgejouqq cih xe ufdeb, lo ac‘d buw cocun to bixq eax dyi kaf zohn el uw evqixu quffiov juromugoz ta aqtejquv jasejx up pre Sajwuma gvovesojc, ghisrogf ludx piezvuxw am isy rhuy azum jinc BdoxfAE acw Yehjiqu.
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.