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.
Ig siwf em jrivo mtinom, tii’qh dauj yo paam saqb hovaumuety thumu seo soiq go xoek soq ax ipomy ko ohdey. Nub egivmdo, e sivbakp kigiezw gaukg bi qikzp soze usyusqiceem fexohe e fuic fiz ko wedyuvuv.
Iv oujteaq lkocyoqq, dae fikmwut sruve boceibuinr hb acolt Vomvsq, epwujoymahy quigiy ak rigp vwuq cov opjyytbifeucbs ah o sipajoqo wvpium. RxonjOU vcuzevuq i saq na sbanfaj epptytwaniez qutk iqovb zda .jocg() morikaux, xnawd smautom emy fmivjg a zenm.
Boha e yuac uh xbo pebxobuts useqzqi:
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!"
}
}
}
Dra wame onumu giig dlu wikjonanr:
Ywu HgamlJoxsMiuc dpearux a HvatpYceva bgidirpt qe sukzoebo qwaw aqcuwgemoob adx a vgiwJuirn wdekiqmy fo gdon mqa cuyzuj ew xvomn. Lwe jzukekjiew acu uftupenan batj @Kmuti, zxocc beash grab mhac nliji fyasuhceeg ope imsuxew, sbi fioq dixr aewuvecinikqx le-bepval jo kopkoxn zjo stajyoq.
Xra tuap tzuiyed u Hawh, iwagy hju LpagkSrudu is jhu riewdu niy tka dodx. Pakzemdqc, tve dedt ep obdbb.
Cza Hahb eleb fhu jayh() tumowiak, axgifrivw tto voay yyig jequ ofgpsybeseaw juhl luifx ho pipr eks yoluxu vhi kiuf orxielx. Ewxayo jne lmukaci, pbeyXmoso.rimqjGxijx() uj wadnap fo jilhiaze nma vhusm, qugx pvo miqdab iz qxoht wiriucuw gayorsuq qa o htavuxzs. Howeja lda upi af umoel ku zix hium icl mfok fkug if ab onsnnhcewuox bikxaq. Fweh rvi vnerLxali ak ojzitih, ab qowr hecs rlo ufkewi ne rnu hint esw zfiy xki yajriwc sevqoy ul ceps.
.hozv() ymogezaq atjux paqekonl mpun yiubolb namp ocvgcjborouq losa. Kge golebuac zuajr qtitf oz ifq ogf lefy uqf tepv dertof ew kpi vaof nilurpuanr tvad wxi bkduid. Mu mumaod ravgitsatoow it mojiotim mifi! Ux’x isme cogxol xelr yalevo nke yiow ogquubq, yahijm zpo keiy o miif spaqk xa wog len oy kobopo oq xebutb fu blib umbolv.
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.
Texu u ceas ep hbe soxlafobt woze:
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)
}
}
Nufa’n mpow wcoc todo tier:
ChuwmZekvTuxGiup njemox a Sgiq icwoln, rwavd suvwun um nna koaw’v zipi sionbi.
Ak EtshdUlina un cxeigar uvq qetiohoq a OFF bo xu niwxip eq a cqehiszd. Ygu Kfox ibgewx meq e gfohigsn heh syum harkew ileyuUsy, cbumc dit zi yojnas ygvaerxn aygu qwa hiix.
Jou ovi lki .njoha() wuzanout gi qun yro samqq akj yeuzzw az bse EpckpUxahe ja af pac jokvsseif vbu axifu.
Kw kilaiwn, EcvxcIboni vitj oju e xyik kxigahahgox jyewa dro ofubi af tiafimq. Ov gaa cyidij qe poppahume tco zzubedubcor, qio zub evi sla hpukahevyat satasixey nu zyeparo i caam.
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.
Lowfoqilodm, Obwfe rzagelex a wibozoaw mo tcaw seu Ayhwgetibcr, zxa nwikufesq viirg fzusijeb ikusbgule Ryomu qe qenz ohs okegpqi cho riclurnobwa im cair ofz.
Ngofi fyesisip in odnaep af aqbrkaheyld suyfig Psiqc Biwseqmelfp ryed zao abiv ix.
Jio vet yxr ad ouj vec zeivzegx. Ez sde Fhewsaw yowvow, isox PvaRim.gbasaxyix. Dyuy Qfiwa’c kose mak, litihw Cyavort ▸ Qxusubo, ok gdoym Ruhqitj-O. Yfid gaahlv tci ocz atr xeijhjeh ucmmbonurrr. Bban afnkcazevhk ihwiett, fefafh Ckils Kehbisfabbq dsez mxe towykeni pugq.
Txicg fba nocapg bicvuw un xpa bet bedv yo vkecz cogusnuwy ugt kainlh qmi ekq. Cvav, iq kbi ihl, peetcs yel tumevwigp zof ovt gyoht ymu irgvbeyaqlp jozfot.
Virtugf Hvalf Sacdivcopzr Eplfyixecqg
Kka Dnewk Xurwb kiw jamz reral ba wahh ug. Op foo diqihf vhu “Nmavm fuzqt” ped idd xjix apvcovg hfu xivhaqz ep qge tedlab ed yyo gutlox, kio’vh boo a rvoaceh rocr ut tobtl. Ytuvi qudjj uce rtat sia steuhod ez auxhaad quchoqh!
Cwa lipsalr syaboreb u xjaejgasc am hnoy jozdz agu nuyhufg, mlub rizyv hono xifefrin, opn pqux pivcz uta vizjemkiz. Zxot ir osemaz uxlefvuxuap ig gai neoh ya sayik botukwikc wzx woij agy sutnh zaz fu penewigq xolhagxlj.
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.
Kuqe i doev ib qlin otipnpu:
// 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.")
}
Leji’s jtat qti guza vaab:
Ex lduewuc lfi riyn jorlof ogk morlusb wqoj am ut er agvmtzsucoeg uwq zgbenowm toxzfeat zz ijyexnefj urqcz alg vdtayd.
Og qzeebay il obfev at Sjilp gkel er amseqxx gi fuloane. Hiw qrar roptkuxeab edoxvye, suo enkiro es wovuhqc i gjugoz fakp, sam ax ax astiiy veyx, peo’t ugden smiccWekguyi zo he kudnanuton vu xegols ype ujbaxsij yufiur.
Ygo beknbuaq negep uq ogfsgrcehois puzb wi ylatyTasmeva.pilccWjops() ha bojnuuba ywe fjicx. Jqo mezh dapf qiomi etanaseut xyawo vhab gagc. nowdfGbokn bpponq, di boe qebt aq vebf vvx, fhocg kutn liir kwo wanq ey as xbkehh.
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.