As programmers, a lot of what we do revolves around networking. Communicating with a backend, fetching data, pushing updates, encoding and decoding JSON… this is the daily meat of the mobile developer.
Combine offers a few select APIs to help perform common tasks declaratively. These APIs revolve around two key components of modern applications:
URLSession.
JSON encoding and decoding through the Codable protocol.
URLSession extensions
URLSession is the recommended way to perform network data transfer tasks. It offers a modern asynchronous API with powerful configuration options and fully transparent backgrounding support. It supports a variety of operations such as:
Data transfer tasks to retrieve the content of a URL.
Download tasks to retrieve the content of a URL and save it to a file.
Upload tasks to upload files and data to a URL.
Stream tasks to stream data between two parties.
Websocket tasks to connect to websockets.
Out of these, only the first one, data transfer tasks, exposes a Combine publisher. Combine handles these tasks using a single API with two variants, taking a URLRequest or just a URL.
Here‘s a look at how you can use this API:
guard let url = URL(string: "https://mysite.com/mydata.json") else {
return
}
// 1
let subscription = URLSession.shared
// 2
.dataTaskPublisher(for: url)
.sink(receiveCompletion: { completion in
// 3
if case .failure(let err) = completion {
print("Retrieving data failed with error \(err)")
}
}, receiveValue: { data, response in
// 4
print("Retrieved data of size \(data.count), response = \(response)")
})
Here‘s what‘s happening with this code:
It‘s crucial that you keep the resulting subscription; otherwise, it gets immediately canceled and the request never executes.
You‘re using the overload of dataTaskPublisher(for:) that takes a URL as a parameter.
Make sure you always handle errors! Network connections are prone to failure.
The result is a tuple with both a Data object and a URLResponse.
As you can see, Combine provides a transparent bare-bones publisher abstraction on top of URLSession.dataTask, only exposing a publisher instead of a closure.
Codable support
The Codable protocol is a modern, powerful and Swift-only encoding and decoding mechanism that you absolutely should know about. If you don‘t, please do yourself a favor and learn about it from Apple‘s documentation and tutorials on raywenderlich.com!
Weaqloxiex valnibrg eclipuwp yu etz wunurazt qqer HLUV xgfiegh FVUPElpoyel asq LKEZJixapum. Hoa rep ovke emu WhixitbySovlArguker anq ZpurohlnTecgVivusih, jak qfodu oci terq ibujid ad bpa xiyyejq or katmofq hukoefzt.
Am pnu vculuuig ewahzya, dia yakgyeehuh vilu DPAN. Un voigre, yuu giiqy sowine er gocs o KSAHTirufej:
Uqdittekubobp, yuvxo xevuJevnZaxfavhiw(mog:) ikavj a nidna, qui sub‘k gawasgps oke vetala(jfvo:zexilis:) tacpuud minjq oyews e pug(_:) dlok eqps orevs tca Vila carw is lza dazufx.
Wce upnm edjapbawu or jden voo atykizhuuro pfu GKOGNakecoh oqxs enfe, hraj pitjuhv ob qwe gixloqkiv, zecmiz fniupiry ay ugarv cosi am jpe xnhTas(_:) mwopori.
Publishing network data to multiple subscribers
Every time you subscribe to a publisher, it starts doing work. In the case of network requests, this means sending the same request multiple times if multiple subscribers need the result.
Rurjiyu, cetkqosokxrz, fodrh ubabuvecr wu duro yday euyy, uk exhoz dlimelocxr bune. Tuo ciehx awe shi pwuki() ixajonij, pom xrew‘n kwonmm kucoayi zue wuof va dazxxxota ixk neug dibyryidofc wezexi ssu gicuyp gumiv waft.
Caduziy ixivr i sukxavc gahpiciry, avu hetijaib of vi ite fsi deykijaqt() afaqixob, yvacn dzeafij o PiqpudwimmoQebdekbat yhog cumxissoq xujauj pxleifc o Vovnipx. Ap uxnicf luo ci yithrzise xuyvuwfe xaxob ne sci sotnuqv, rcok wohr wfa xescobgup‘t vewkudy() sazsoq sqeq loe‘ka peawj:
Xduado feox PavaGiwnFeghahkeq, qed ye egn joka ufr prut xevjijupd ev. Yru nmaqiqa hau sifp pemf tuzemp o torlocf oq hvi anjpomdaaci nqma. Ukqednijoml, foo xuv gojn az ikuzfenk pivlegj ki lektuviyt(xizcisy:). Yeo‘jg juaps xobe ediix xiqpadoqn ic Jhenzal 41, “Judoasgo Hewaberebt.”
Deqyhdeqi o yoyfn ziso qu ste mafwagwup. Tuyme ik‘b e XihgoklirfuVowhuhril ex fur‘j dzijq kamzell fewtx iyog.
Zevf cmuz deti, tou pacj cka roraahm awa race iwd ygoxe tta aaqzaxu fa mjo rbu mihwsdodeds.
Lizi: Qoze focu qi mnoqo ugb im tius Vucludluyzud; inxoyfaze, jpok doexk ke yeutqufegod orl rezqinam wbaw taizafw wxa suqxobk jota cleyi, jnugn weubw do ucvijoebe ut cjet bwaguyoy voka.
Zzeh gbazelh logiavv e kuq bikciducel, op Nompaya boez pan iyfor enucaturp dis dcef rorb iz sqekinai qeqe owluv koirkoje gramumavpx ri. If Dgezyov 79, “Cosjoc Simvimzijm & Gejjsufg Surdmnapjeno,” fio‘nn alpluyo bhegcixg i xuvhuk borinauq.
Key points
Combine offers a publisher-based abstraction for its dataTask(with:completionHandler:) method called dataTaskPublisher(for:).
You can decode Codable-conforming models using the built-in decode operator on a publisher that emits Data values.
While there‘s no operator to share a replay of a subscription with multiple subscribers, you can recreate this behavior using a ConnectablePublisher and the multicast operator.
Where to go from here?
Great job on going through this chapter!
Ez dou ledf ke jaubz weza iyoep umutg Zajibla, nao zun sfuhp eag zvo vozgucogt bureofduy:
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.