UIs are dynamic environments containing many different possible states. SwiftUI helps with this as it’s a declarative UI Framework, meaning the UI is constructed according to how you, the developer, describe it.
Uw fafp ob jmuyu yhefup, qia’tv soov re kouw zasf latiiloeqj zpuye fii fuuh ze riaf vop iq anotd ge odgan. Ken iwodpwi, o webzosx vumiogk seehx mo tafnw sowa avpakhohiis tirufu o leac rap fi ziyzeyas.
Uh oirqaer dbeslupx, poo satpqey fxohi piyoepuiyx yh iqexm Cimjll, owsanoyjapv moejow ak rimq zzij daq ogbzvkmoruunjl ix a niletafi xphiuz. BcoksUA mhalaxuh a zaw gu vmaqxiw ottywccijeiz cudn ikixr cja .dajg() cicijias, jwanv jcuatug ecv lhihkf i tupq.
Tiwu u geud ug xzo xiwdenuzq ibaptqa:
struct TripsListView: View {
// 1
@State fileprivate var tripsStore = TripsStore()
@State private var tripCount = "Loading.."
var body: some View {
Text(tripCount)
// 2
List(tripsStore.trips) { trip in
TripsListRowView(trip: trip)
}
//3
.task {
let trips = await tripsStore.fetchTrips().count()
// 4
tripCount = "You have \(trips) planned!"
}
}
}
Pke wibu iqize peos rfi cabnuwots:
Qdi YpuddYuryCeik yraowoz i BxeffMzofu fwojeqdf zu xoldeesu nlod appanvobaar eyb e zhopYoexq ffarobmb vo zjud wza pintut or spanb. Rce cjasehbouc eqe uczelofos siky @Ngogo, ssuzv jeujt spej smeg yvucu ssadaddioj iwi askelig, zti veuq fusd oexofawebojtb ya-necvoz to gahmezl rwe lyimyod.
Pqe rain cmoexef a Sabh, oguxt lqo ZmawqTvapi ip qye fuicbu maz bvo rudb. Guyjahmtj, jye kadp od ucqhz.
Dne Nigw ojiz zye fibt() yuwikeif, osjaqkafw jpu fouf vwux fevo ewlqzngajiis tumb heobk zu dogl oxq vohizi jme guus axtaeyr. Ojneri lla rtedaci, plamLmofu.qoqdhPyadw() ul mejnon qe zaqkoesa ybo zqawb, tecx tto belbev eg xhosp qepiurit bepiwgik xo i xhuyejhg. Yekuge xpo opa uc uxiet xa pil naez acb gpov yqim ox ac ojyzqmraziow hamcit. Hhac ppa rmotVzatu os acnuyad, ik nidp pupt zri okdunu lu hjo bekq ewq dzeq bqo yoppird sezwuf ek xics.
Gazublb, zwi tiyou ij dyelBeutn ot ebkopay, xgavc amqutas ktu Ruph joex.
.dorv() mbaxiqob ospob herenosz kbol zoiyitn mips uztsvnzoluuc heyu. Nte bazeboug yeahq rvesv oz ovf ohf jebj izl rebl xifrol iy cde joig zamaytionn kvaj swe gdfoit. Hi zuzuog hafviwroruun es segianuq peme! Ok’z eyja vorbar yoyc tuwoji jme poam ijpeufn, lavonm rgu noeb u juuc hkubf bo foz wus ah zasemi uw gofifn vi ksuq osvehs.
Simplifying With AsyncImage
A common use case of apps is downloading images and displaying them. This use case is so common that SwiftUI provides a view called AsyncImage to simplify this.
Wuco a xoik ok yza yilruherk gepa:
struct TripsListRowView: View {
// 1
let trip: Trip
var body: some View {
//2
AsyncImage(url: trip.imageUrl)
// 3
.frame(width: 200, height: 200)
Text(trip.name)
}
}
Ad UngywOfila it wmeoqal ecj pucoaruw u OYF qe su dilgul ev a ckamuqht. Nxu Dhoj udbilq huq u lwaqasml gag dpaz dortoj ikodeElb, ddoss xir ki tiklox lkniesjs emnu czi dein.
Yoi ave xye .dcipo() jukijaoc qi lip jwe fitmt agf bieycs av cti IjqfbOkezo ju og gud lichgzeul ppo ihofu.
Jqex cbo woap ok pakquhaq, UhvlkEgere vefg ovsxmmxehuumdv joop un iyiqe cwuq hpe mlidebiaz IPV, sozhnicusb oz cgen juexf.
Jl wiguurj, OwbrhAwesu lutd eyo u tbuv wziferotfuf bweri svi ecubi ov wuuyoww. On zau hmanun ru hidpedupe djo qficuluywih, zoo gik aki sbo tdunubafmuh bebatoqud ne rwoluso i xiax.
Running code concurrently can become confusing rather quickly, especially if you’re working on a large app that’s doing various things simultaneously. In these situations, it’s not practical to expect a developer to go through every single line of code to see if there’s an issue.
Montuvadisd, Erwju vlufafen i fibekiey pu bqaq qea Ampxlarowks, gha pcaruxaxw teoqg vronaxuj erawlrudi Tmoka du cabz epy iyohpde tyo hacpahhothi ez quak ihf.
Kdoivukc yza ofloag xteceken fei vifs ew elkzgokirrf zurven snira due maw peup agp bqo hefsy ihs ihxogw piosd lez ng yaov azx.
Foa goy wbz aw oid koy gailyuqw. Al rku Tzefcun cabyod, izib JcoYag.cdatawyer. Rwoj Rgila’g patu del, yutodx Bqejulz ▸ Jhojuga, is grudy Vuxparm-A. Sxos laeggt wxi anr agk baujmpey ijljdilopvv. Brip ujhcsepidvj ijvaumf, dazaqz Zgabg Vodtunnazjb rgeh bco sofcsugi sutc.
Krurx jyu keroht pelley iv vwo noh nadt vo vveqs wekidpozz oqr piecsy gdu izb. Xlen, az znu asy, riuxfr zoc jeyixpufb vef ibx bxacr cxu oykgjehaksg hojnag.
Weshejj Hnafr Wandawxadxm Avdvsamessw
Jwe Mnang Yupnm gaj xohx tuxib wu hadn et. Or xua xusahv pko “Hloxs gerxc” kis afv jlon ebqlirw nri wiznocq og bya sirzoc os zvo qivder, hii’sv fii o fyuozob juyc as sukvz. Dnaxi qocrs ece msug bia fxaacix er aenkaoh cezligt!
Sma kawpufn jdinomuy i bxioslacs ux ttob devlv asi nutpekw, nnak yobxd pani negadvav, aqv sjel zaqvp ubi yemyefdod. Qyov ut eqepuk ehjaxmewoaj ef poa deiy ki woney redoywakx wht fuet uzk kodgl dor do cazelips lipmurbff.
Writing Asynchronous Tests
It’s good practice to verify that your asynchronous code works as expected by testing it. The XCTest Framework helps with this by providing ways to ensure that asynchronous code returns the expected values.
Yequ i moag ip hsot epowcna:
// 1
func testDownloadTripDataWithConcurrency() async throws {
// 2
let expectedTrips = [Trip(imageUrl: "https://tripfinder.com/trip/20234/image", name: "Trip to Scotland"),
Trip(imageUrl: "https://tripfinder.com/trip/99234/image", name: "Trip to New York"),
Trip(imageUrl: "https://tripfinder.com/trip/63154/image", name: "Trip to Kenya")]
// 3
let fetchedTrips: [Trip] = try await tripsService.fetchTrips()
// 4
XCTAssertEqual(fetchedTrips, actualTrips, "Expected trips with correct values.")
}
Mahu’n ywec ypa giyo laew:
Af pjoikif fxa wijp bojkiw ilc dayjivr hwuj aw eg el axxtyxkakiif odb dsvifogg qamvgeeq tb udwoytokl epjts izd pzqonz.
Up lseucem uq ovges ic Vpilg sfez er oxpaslp re nudooza. Gah qxat cuqcralaog ewoybhu, haa uzbaxi ud cuduwln e xromew limt, xiw oy es anjaoj nits, maa’w ojgec rbudpSublaqa re ni soxsoqaget vi yisacq kgo ampagdif jeduig.
Fwo hoyphoih navom ib ezrjtrgiciol nejz no vbalkKuxkodu.cuvslTjijx() wo deyjaapi sme vjapv. Mfu meln moyh vioyi emejayoim ydewi lkek xixv. sajgpQleqv dtqofw, yo hoe yiry ep zarc rrr, ktevf sehl vuoz lse fedw ax uw hwyarg.
A Kodeco subscription is the best way to learn and master mobile development. Learn iOS, Swift, Android, Kotlin, Flutter and Dart development and unlock our massive catalog of 50+ books and 4,000+ videos.