Suwıq aǵımnan paydalanıwǵa mısallar

|
Suwıq aǵımnan paydalanıwǵa mısallar
|
bet | 2/2 | Sana | 18.05.2024 | Hajmi | 71,61 Kb. | | #241377 |
Bog'liq 245-251Suwıq aǵımnan paydalanıwǵa mısallar
Málim bolıwısha, barlıq múmkin bolǵan operatorlardan paydalanǵan halda bir mısaldı tańlaw eń jaqsı usıl emes. Bunıń ornına biz bir neshe operatorlardan paydalanıwdı kórsetetuǵın hár qıylı paydalanıw jaǵdayların usınıs etemiz.
Variant 1: Qayta qońıraw qılıw funksiyasına tiykarlanǵan API menen interfeys
Aytaylik, siz chat qosımshasın islep shıǵıp atırsız. Paydalanıwshılaringiz bir-birlerine xabar jiberiwleri múmkin. Xabarlarda sáne, xabar avtorına silteme ámeldegi hám olardıń mazmunı ápiwayı tekst retinde kórinedi.
Bul Message maǵlıwmatlar klassi:
data class Message (
val user: String,
val date: LocalDateTime,
val content: String
)
Biz xabarlar aǵımın Xabar úlgisi dep esaplasak ájep emes. Hár sapar paydalanıwshı programmaǵa xabar jiberganida, sabaq onı uzatadı. Házirshe, biz Flow mısalın qaytarıwshı getMessageFlow funksiyasın shaqıra alamız dep shama menen oylayıq. Kotlin Flows kitapxanasınan paydalanıp, ózińizdiń aǵıslarıńızdı jaratılıwmasıńız múmkin. Biraq, ulıwma jaǵdaylarda flow API-den qanday paydalanıwdı úyreniwden baslaw logikalıq:
fun getMessageFlow (): Flow {
// keyin ámelge asıramız
}
Endi shama menen oylayıq, biz málim bir paydalanıwshınıń barlıq xabarların demde basqa tilge awdarmalawımız kerek. Buǵan qosımsha túrde, biz awdarmanı fon aǵımı járdeminde ámelge asırmoqchimiz.
Biz getMessageFlow () funksiyasın shaqırıw arqalı xabarlar aǵımın alıwdan baslaymız hám keyin operatorlardı tómende kórsetilgen sıyaqlı túp aǵımǵa qollaymiz:
fun getMessagesFromllser (user: String, language: String): Flow {
return getMessageFlow ()
filter {it.user == user} О
map {it.translate(language) } 0
flowOn (Dispatchers.Default) ©
}
O Birinshi operator, filtr, túp aǵımda isleydi hám basqa xabar aǵımın qaytaradı. Bul barlıq aǵıslar parametr retinde qabıl etilgen birdey paydalanıwshınan (paydalanıwshı) keledi.
Temalar| 247
© Ekinshi operator, karta filtr arqalı qaytarılǵan aǵımda isleydi hám awdarma etilgen xabarlar aǵımın qaytaradı. Filtr operatorı kózqarasınan derek aǵımı (getMessageFlowQ funksiyası tárepinen qaytarıladı ) joqarı aǵım bolıp tabıladı hám baǵınıqlı aǵıs filtrden keyin keletuǵın barlıq sóz dizbegiler menen ańlatıladı. Tap sol oy-pikir barlıq aralıq gápler ushın ámel etedi - olar ózleriniń sáykes keletuǵın joqarı hám tómen aǵıslarına iye (10. 2-súwret).
© Aqır-aqıbetde, flowAz waqıt bayanatı ózi islep atirǵan aǵıs kontekstin ózgertiredi. Ol boysınıwshı ipga tásir etpesten, tiykarǵı ipning koroutini kontekstin ózgertiredi. Sonday etip, 1 hám 2-basqıshlar Dispetcherler. Default járdeminde ámelge asıriladı.
Basqasha etip aytqanda, joqarı aǵıs operatorları (mısalı, filtr hám tar sıyaqlı ) endi inkapsullangan: olardıń atqarılıw konteksti Dispetcherler. Default hám mudamı usınday boladi. Alınǵan aǵıs qanday kontekstte tóplanǵanlıǵı zárúrli emes; aldın aytıp ótilgen bayanatlar Dispetchers. Default járdeminde atqarıladı.
Bul kontekstti saqlaw dep atalatuǵın sabaqlardıń júdá zárúrli ózgesheligi. Oyda sawlelendiriw etiń -a, siz programmanıń UI aǵımında aǵıs toplayapsiz - ádetde bul maqsette viewModel-den viewModelScope isletiledi. Eger aǵıs bayanatlarınan birewiniń atqarıw konteksti sizib shıqsa hám Aǵıs jıynalǵan temaǵa tásir etse, bul qolaysız bo'lar edi. Jaqsıyamki, bul hesh qashan júz bolmaydı. Mısal ushın, eger siz Flow-ni UI tarmaǵında yig'sangiz, barlıq bahalar Dispatchers. Main-den paydalanatuǵın koroutin tárepinen qaytarıladı. Barlıq kerekli kontekstli giltler avtomatikalıq túrde basqarıladı.
Gúrish. 10. 2. Joqarı hám tómen aǵıs sabaqları
Qaqpaq astında, flowAz waqıt bayanatı kontekst ózgeriwin anıqlaganida jańa koroutinni baslaydı. Bul koroutin ipning qalǵan bólegi menen ishki basqarılatuǵın kanal arqalı baylanıs etedi.
248| 10 -bap
Tarmaqlı tilde aralıq gáp, mısalı, tar joqarı aǵıs ipida isleydi hám basqa ipdan qaytadı. Tar operatorı kózqarasınan, qaytarılǵan aǵıs qul bolıp tabıladı.
Tar operatorı konversiya blokı retinde pauza funksiyasın qabıl etedi. Sonday etip, eger xabarlardı tek Dispatcher. Default járdeminde awdarmalawımız kerek bolsa (xabarlardı filtrlew ornına), biz flowAz waqıt bayanatın alıp taslawımız hám awdarma funkciyasın járiyalawımız múmkin:
private suspend fun Message. Translate (
language: String
): Message = withContext (Dispatcherlar. Default) {
// bul nusqa kóshiriwdiń jalǵan ámelge asırılıwı
Copy (content = "translated content")
}
Maǵlıwmatlar aǵımınıń ulıwma suwretine iye bolǵan halda, maǵlıwmatlardı ózgertiw bólimlerin basqa aǵıslarǵa ótkeriw qanshellilik ańsatligini kóresizmi?
Kórip turǵanıńız siyaqlı, Streams API sizge maǵlıwmatlar transformaciyasın deklarativ tárzde ańlatıw imkaniyatın beredi.getMessagesFromUser (" Amanda", " en-us") shaqırıw tiykarınan hesh nárse etpeydi. Bul transformaciyalardıń barlıǵı aǵıs jıynalǵanda janıp ketetuǵın aralıq bayanatlardı óz ishine aladı.
Qarıydarǵa kelsek: eger biz qabıl etilgen hár bir xabardı uzatıwımız kerek bolsa, biz jıynaw funkciyasınan paydalanıwımız múmkin:
fun main () = runBlocking {
getMessagesFromUser("Amanda", "en-us").collect {
printin("Received message from ${it.user}: ${it.content}")
}
}
Endi biz aǵımdı qanday ózgertiw jáne onı tutınıwdı kórsetkenimizden keyin, biz aǵımdıń ózin ámelge asırıwdı támiyinley alamız : getMessageFlow funksiyası. Bul funkciyanıń qolı xabar aǵımın qaytarıwı kerek. Bunday jaǵdayda xabar mexanizmi tiykarınan óz tarmaǵında isleytuǵın xızmet dep shama qılıw aqılǵa say. Keling, onı MessageFactory dep ataymız.
Kóplegen soǵan uqsas xızmetler sıyaqlı, MessageFactory baspachi/obunachi mexanizmine iye - biz tómende kórsetilgeni sıyaqlı, jańa kiretuǵın xabarlar ushın gúzetshilerdi dizimnen ótkeziwimiz yamasa dizimnen óshiriwimiz múmkin:
|
| |