Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Vese vashandisi vanotora kukurumidza kuvhurwa uye inopindura UI mune nharembozha zvikumbiro. Kana iyo application ikatora nguva yakareba kutanga, mushandisi anotanga kunzwa kusuwa uye kutsamwa. Iwe unogona kukanganisa zviri nyore ruzivo rwevatengi kana kurasikirwa zvachose nemushandisi kunyangwe asati atanga kushandisa application.

Isu takamboona kuti app yeDodo Pizza inotora masekonzi matatu kuvhura paavhareji, uye kune vamwe "nemhanza" zvinotora masekonzi gumi nemashanu kusvika makumi maviri.

Pazasi pekuchekwa pane nyaya ine magumo anofadza: nezve kukura kweRealm dhatabhesi, ndangariro inodonhedza, kuti takaunganidza sei zvinhu zvakaiswa dendere, tobva tazvidhonzera pamwechete ndokugadzirisa zvese.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu
Munyori wezvinyorwa: Maxim Kachinkin - Android kuvandudza kuDodo Pizza.

Masekonzi matatu kubva pakudzvanya pane icon yekushandisa kuenda paResume () yekutanga chiitiko haina magumo. Uye kune vamwe vashandisi, nguva yekutanga yakasvika 15-20 masekondi. Izvi zvinogoneka sei?

Pfupiso pfupi kwazvo kune avo vasina nguva yekuverenga
Yedu Realm dhatabhesi yakakura nekusingaperi. Zvimwe zvinhu zvaiva nematendere hazvina kudzimwa, asi zvaigara zvichiunganidzwa. Iyo nguva yekutanga application yakawedzera zvishoma nezvishoma. Ipapo takaigadzirisa, uye nguva yekutanga yakasvika kune chinangwa - yakava isingasviki 1 sekondi uye haina kuzowedzera. Chinyorwa chine ongororo yemamiriro ezvinhu uye mhinduro mbiri - yekukurumidza uye yakajairika.

Kutsvaga uye kuongorora dambudziko

Nhasi, chero nharembozha inofanirwa kutanga nekukasira uye ipindure. Asi hazvisi zve mobile app chete. Mushandisi ruzivo rwekudyidzana nebasa uye kambani chinhu chakaoma. Semuenzaniso, kwatiri isu, kumhanya kwekutumira ndeimwe yeakakosha zviratidzo zvebasa repizza. Kana kutakura kuchikurumidza, pizza inenge ichipisa, uye mutengi anoda kudya iye zvino haafaniri kumirira kwenguva refu. Zvekushandisa, zvakare, zvakakosha kugadzira manzwiro ekukurumidza sevhisi, nekuti kana application ichingotora masekondi makumi maviri kuti itange, saka inguva yakadii yaunofanirwa kumirira iyo pizza?

Pakutanga, isu pachedu takatarisana nenyaya yekuti dzimwe nguva application yaitora masekondi mashoma kutanga, tobva tatanga kunzwa zvichemo kubva kune vamwe vatinoshanda navo kuti zvakatora nguva yakareba sei. Asi hatina kukwanisa kuramba tichidzokorora mamiriro ezvinhu aya.

Yakareba sei? Maererano ne Zvinyorwa zveGoogle, kana kutonhora kwekutanga kwekushanda kunotora zvishoma kudarika 5 seconds, zvino izvi zvinonzi "sezvinowanzoitika". Dodo Pizza Android app yakatangwa (maererano neFirebase metrics _app_start) pa kutonhora kutanga paavhareji mumasekonzi matatu - "Hazvina kunaka, kwete zvakaipa," sezvavanotaura.

Asi zvino zvichemo zvakatanga kuoneka kuti chikumbiro chakatora nguva yakareba kwazvo kuti itange! Kutanga, takasarudza kuyera kuti "zvakanyanya, zvakanyanya, kureba" chii. Uye isu takashandisa Firebase trace yeizvi App yekutanga kutsvaga.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Iyi yakajairwa kuteedzera inoyera nguva pakati penguva iyo mushandisi anovhura application uye nguva iyo onResume () yekutanga chiitiko chinoitwa. MuFirebase Console iyi metric inonzi _app_start. Zvakaitika kuti:

  • Nguva dzekutanga dzevashandisi pamusoro peiyo 95th percentile dzinenge 20 masekonzi (mamwe akatorebesa), kunyangwe nguva yepakati inotonhora yekutanga iri isingasviki masekonzi mashanu.
  • Nguva yekutanga haisi yakakosha nguva dzose, asi inokura nekufamba kwenguva. Asi dzimwe nguva pane madonhwe. Takawana iyi pateni patakawedzera chiyero chekuongorora kusvika kumazuva makumi mapfumbamwe.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Pfungwa mbiri dzakauya mumusoro:

  1. Pane chiri kubuda.
  2. Ichi "chimwe chinhu" chinogadzwa patsva mushure mekuburitswa uye chobva chadonha zvakare.

"Zvichida chimwe chinhu chine dhatabhesi," takafunga, uye taive chokwadi. Chekutanga, isu tinoshandisa dhatabhesi secache; panguva yekutama tinoibvisa. Chechipiri, dhatabhesi inorodha kana application yatanga. Zvose zvinopindirana.

Chii chakashata neRealm database

Takatanga kutarisa kuti zviri mukati medhatabhesi zvinoshanduka sei pamusoro pehupenyu hwechishandiso, kubva pakumisikidzwa kwekutanga uyezve panguva yekushandiswa kwekushanda. Iwe unogona kuona zviri mukati meRealm dhatabhesi kuburikidza stetho kana mune zvakadzama uye zvakajeka nekuvhura faira kuburikidza Vadivelu Comedy Realm Studio. Kuti uone zviri mukati medhatabhesi kuburikidza neADB, kopira iyo Realm database faira:

adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME}

Takatarisa zviri mukati me database panguva dzakasiyana, takaona kuti nhamba yezvinhu zveimwe mhando iri kuramba ichiwedzera.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu
Mufananidzo wacho unoratidza chidimbu cheRealm Studio yemafaira maviri: kuruboshwe - iyo base yekushandisa imwe nguva mushure mekuiswa, kurudyi - mushure mekushandisa. Zvinogona kuonekwa kuti nhamba yezvinhu ImageEntity ΠΈ MoneyType yakakura zvakanyanya (iyo skrini inoratidza huwandu hwezvinhu zvemhando yega yega).

Hukama pakati pekukura kwedatabase uye nguva yekutanga

Kusadzora kukura kwedatabase kwakaipa kwazvo. Asi izvi zvinokanganisa sei nguva yekutanga application? Zviri nyore kuyera izvi kuburikidza neActionManager. Kubva Android 4.4, logcat inoratidza irogi netambo Yakaratidzwa uye nenguva. Iyi nguva yakaenzana nepakati kubva panguva yakatangwa application kusvika pakupera kwebasa rekupa. Munguva iyi zviitiko zvinotevera zvinoitika:

  • Tanga maitiro.
  • Kutanga kwezvinhu.
  • Kusikwa uye kutanga kwemabasa.
  • Kugadzira marongerwo.
  • Kupa application.

Inokodzera isu. Kana iwe uchimhanyisa ADB ne -S uye -W mireza, unogona kuwana yakawedzera kuburitsa nenguva yekutanga:

adb shell am start -S -W ru.dodopizza.app/.MainActivity -c android.intent.category.LAUNCHER -a android.intent.action.MAIN

Kana ukaibata kubva ipapo grep -i WaitTime nguva, unogona otomatiki kuunganidzwa kweiyi metric uye nekuona tarisa mhinduro. Girafu iri pazasi inoratidza kutsamira kweiyo nguva yekutanga application pahuwandu hwekutonhora kwekutanga kwekushandisa.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Panguva imwecheteyo, paive nemhando imwechete yehukama pakati pehukuru nekukura kwedhatabhesi, iyo yakakura kubva ku4 MB kusvika ku15 MB. Pakazara, zvinoitika kuti nekufamba kwenguva (nekukura kwekutonhora kunotanga), zvese zviri zviviri nguva yekutanga application uye saizi yedatabase yakawedzera. Tine fungidziro pamaoko edu. Zvino chakanga chasara kwaiva kusimbisa kutsamira. Naizvozvo, isu takasarudza kubvisa "kudonha" uye kuona kana izvi zvaizomhanyisa kuvhurwa.

Zvikonzero zvekusingaperi dhatabhesi kukura

Usati wabvisa "kudonha", zvakakosha kunzwisisa kuti nei vakaonekwa pakutanga. Kuti tiite izvi, ngatirangarirei kuti Realm chii.

Realm ibhuku risiri rehukama. Zvinokutendera kuti utsanangure hukama pakati pezvinhu nenzira yakafanana kune mangani eORM ehukama dhatabhesi pa Android anotsanangurwa. Panguva imwecheteyo, Realm inochengeta zvinhu zvakananga mundangariro ine hushoma huwandu hweshanduko uye mepu. Izvi zvinokutendera kuti uverenge data kubva kudhisiki nekukurumidza, inova simba reRealm uye nei ichidiwa.

(Nezvinangwa zvechinyorwa chino, tsananguro iyi ichatikwanira. Unogona kuverenga zvakawanda nezve Realm mune inotonhorera zvinyorwa kana mune yavo academy).

Vazhinji vanogadzira vakajaira kushanda zvakanyanya nehukama dhatabhesi (semuenzaniso, ORM dhatabhesi neSQL pasi pehodhi). Uye zvinhu zvakaita se cascading data deletion zvinowanzoita sekunge zvakapihwa. Asi kwete muNyika.

Nenzira, iyo cascade yekudzima ficha yakabvunzwa kwenguva yakareba. Izvi revision ΠΈ mumwe, yakabatana nayo, yakakurukurwa nokushingaira. Paiva nepfungwa yokuti zvichakurumidza kuitwa. Asi zvino zvose zvakashandurirwa mukusumwa kwemasimba akasimba uye asina simba, izvo zvaizogadzirisawo dambudziko iri pakarepo. Akanga ane upenyu uye achishanda pabasa iri dhonza chikumbiro, iyo yakambomira nekuda kwekunetseka mukati.

Data leak pasina cascading kudzima

Iyo data inodeuka sei chaizvo kana iwe uchivimba neasipo cascading kudzima? Kana iwe uine nested Realm zvinhu, saka zvinofanirwa kubviswa.
Ngatitarisei muenzaniso (unenge) chaiwo. Tine chinhu CartItemEntity:

@RealmClass
class CartItemEntity(
 @PrimaryKey
 override var id: String? = null,
 ...
 var name: String = "",
 var description: String = "",
 var image: ImageEntity? = null,
 var category: String = MENU_CATEGORY_UNKNOWN_ID,
 var customizationEntity: CustomizationEntity? = null,
 var cartComboProducts: RealmList<CartProductEntity> = RealmList(),
 ...
) : RealmObject()

Chigadzirwa chiri mungoro chine minda yakasiyana, kusanganisira mufananidzo ImageEntity, customized ingredients CustomizationEntity. Zvakare, chigadzirwa chiri mungoro chinogona kuve combo ine yayo seti yezvigadzirwa RealmList (CartProductEntity). Minda yese yakanyorwa zvinhu zveRealm. Kana tikaisa chinhu chitsva (copyToRealm() / copyToRealmOrUpdate()) ine id imwe chete, ipapo chinhu ichi chinozonyorwa zvachose. Asi zvese zvemukati zvinhu (image, customizationEntity uye cartComboProducts) zvinorasikirwa nehukama nemubereki uye zvirambe zviri mudhatabhesi.

Sezvo kubatana navo kwarasika, hatichadziverenge kana kudzidzima (kunze kwekunge tanyatsoiwana kana kujekesa "tafura" yese). Isu takadaidza izvi "memory leaks".

Kana isu tichishanda neRealm, isu tinofanirwa kuenda zvakajeka mukati mezvinhu zvese uye nekudzima zvese izvi zvisati zvaitika. Izvi zvinogona kuitwa, semuenzaniso, sezvizvi:

val entity = realm.where(CartItemEntity::class.java).equalTo("id", id).findFirst()
if (first != null) {
 deleteFromRealm(first.image)
 deleteFromRealm(first.customizationEntity)
 for(cartProductEntity in first.cartComboProducts) {
   deleteFromRealm(cartProductEntity)
 }
 first.deleteFromRealm()
}
// ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ сохраняСм

Kana iwe ukaita izvi, ipapo zvese zvichashanda sezvazvinofanira. Mumuenzaniso uyu, isu tinofungidzira kuti hapana zvimwe zvakavharirwa Realm zvinhu mukati memufananidzo, customizationEntity, uye cartComboProducts, saka hapana zvimwe nested zvishwe uye zvinodzima.

"Kurumidza" mhinduro

Chinhu chekutanga chatakasarudza kuita ndechekuchenesa zvinhu zvinokura nekukurumidza uye kutarisa mhinduro kuti tione kana izvi zvaizogadzirisa dambudziko redu rekutanga. Kutanga, iyo yakapfava uye yakanyanya kujeka mhinduro yakagadzirwa, iyo: chinhu chimwe nechimwe chinofanira kuve nemhosva yekubvisa vana vayo. Kuti tiite izvi, isu takaunza interface iyo yakadzosa runyoro rwezvayo nested Realm zvinhu:

interface NestedEntityAware {
 fun getNestedEntities(): Collection<RealmObject?>
}

Uye isu takazviita mune yedu Realm zvinhu:

@RealmClass
class DataPizzeriaEntity(
 @PrimaryKey
 var id: String? = null,
 var name: String? = null,
 var coordinates: CoordinatesEntity? = null,
 var deliverySchedule: ScheduleEntity? = null,
 var restaurantSchedule: ScheduleEntity? = null,
 ...
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       coordinates,
       deliverySchedule,
       restaurantSchedule
   )
 }
}

Π’ getNestedEntities isu tinodzosera vana vese se flat list. Uye chimwe nechimwe chinhu chemwana chinogona zvakare kuita iyo NestedEntityAware interface, zvichiratidza kuti ine zvemukati Realm zvinhu zvekudzima, semuenzaniso. ScheduleEntity:

@RealmClass
class ScheduleEntity(
 var monday: DayOfWeekEntity? = null,
 var tuesday: DayOfWeekEntity? = null,
 var wednesday: DayOfWeekEntity? = null,
 var thursday: DayOfWeekEntity? = null,
 var friday: DayOfWeekEntity? = null,
 var saturday: DayOfWeekEntity? = null,
 var sunday: DayOfWeekEntity? = null
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       monday, tuesday, wednesday, thursday, friday, saturday, sunday
   )
 }
}

Uye zvichingodaro, dendere rezvinhu rinogona kudzokororwa.

Ipapo isu tinonyora nzira inodzokorodza inodzima zvese zvakavharirwa zvinhu. Nzira (yakagadzirwa sekuwedzera) deleteAllNestedEntities inowana zvese zvepamusoro-level zvinhu uye nzira deleteNestedRecursively Inodzokorodza inobvisa zvese zvakaiswa zvinhu uchishandisa iyo NestedEntityAware interface:

fun <T> Realm.deleteAllNestedEntities(entities: Collection<T>,
 entityClass: Class<out RealmObject>,
 idMapper: (T) -> String,
 idFieldName : String = "id"
 ) {

 val existedObjects = where(entityClass)
     .`in`(idFieldName, entities.map(idMapper).toTypedArray())
     .findAll()

 deleteNestedRecursively(existedObjects)
}

private fun Realm.deleteNestedRecursively(entities: Collection<RealmObject?>) {
 for(entity in entities) {
   entity?.let { realmObject ->
     if (realmObject is NestedEntityAware) {
       deleteNestedRecursively((realmObject as NestedEntityAware).getNestedEntities())
     }
     realmObject.deleteFromRealm()
   }
 }
}

Takaita izvi nezvinhu zvinokura nekukurumidza uye takatarisa zvakaitika.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Nekuda kweizvozvo, izvo zvinhu zvatakafukidza nemhinduro iyi zvakamira kukura. Uye kukura kwese kwechigadziko kwakaderera, asi hakuna kumira.

Iyo "yakajairika" mhinduro

Kunyange zvazvo chigadziko chakatanga kukura zvishoma nezvishoma, chakaramba chichikura. Saka takatanga kutarisa mberi. Yedu purojekiti inoshandisa zvakanyanya kushandisa data caching muRealm. Naizvozvo, kunyora zvese zvakaiswa zvinhu zvechinhu chimwe nechimwe kunoshanda zvakanyanya, pamwe nengozi yekukanganisa inowedzera, nekuti unogona kukanganwa kutsanangura zvinhu paunenge uchichinja kodhi.

Ini ndaida kuve nechokwadi chekuti handina kushandisa mainterface, asi kuti zvese zvakashanda zvega.

Kana tichida kuti chimwe chinhu chishande chega, tinofanira kushandisa kufungisisa. Kuti tiite izvi, tinogona kupfuura nepakati yega yega ndima yekirasi uye tarisa kana chiri chinhu cheRealm kana runyorwa rwezvinhu:

RealmModel::class.java.isAssignableFrom(field.type)

RealmList::class.java.isAssignableFrom(field.type)

Kana munda uri RealmModel kana RealmList, wobva wawedzera chinhu chemunda uyu kune runyorwa rwezvinhu zvakaiswa. Zvese zvakangofanana nezvatakaita pamusoro, pano chete zvichaitwa zvega. Iyo cascade yekudzima nzira pachayo yakapusa uye inoita seizvi:

fun <T : Any> Realm.cascadeDelete(entities: Collection<T?>) {
 if(entities.isEmpty()) {
   return
 }

 entities.filterNotNull().let { notNullEntities ->
   notNullEntities
       .filterRealmObject()
       .flatMap { realmObject -> getNestedRealmObjects(realmObject) }
       .also { realmObjects -> cascadeDelete(realmObjects) }

   notNullEntities
       .forEach { entity ->
         if((entity is RealmObject) && entity.isValid) {
           entity.deleteFromRealm()
         }
       }
 }
}

Extension filterRealmObject inosefa kunze uye inopfuudza chete zvinhu zveRealm. Nzira getNestedRealmObjects kuburikidza nekufungisisa, inowana zvese zvakaiswa Realm zvinhu uye inozviisa mumutsara runyorwa. Zvadaro tinoita zvakafanana nekudzokorora. Paunenge uchidzima, unofanirwa kutarisa chinhu kuti chinoshanda isValid, nekuti zvinogona kunge kuti zvinhu zvevabereki zvakasiyana zvinogona kuva nedendere dzakafanana. Zviri nani kudzivirira izvi uye kungoshandisa auto-chizvarwa cheid paunenge uchigadzira zvinhu zvitsva.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Kuitwa kwakazara kweiyo getNedRealmObjects nzira

private fun getNestedRealmObjects(realmObject: RealmObject) : List<RealmObject> {
 val nestedObjects = mutableListOf<RealmObject>()
 val fields = realmObject.javaClass.superclass.declaredFields

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅, Π½Π΅ являСтся Π»ΠΈ ΠΎΠ½ΠΎ RealmModel ΠΈΠ»ΠΈ списком RealmList
 fields.forEach { field ->
   when {
     RealmModel::class.java.isAssignableFrom(field.type) -> {
       try {
         val child = getChildObjectByField(realmObject, field)
         child?.let {
           if (isInstanceOfRealmObject(it)) {
             nestedObjects.add(child as RealmObject)
           }
         }
       } catch (e: Exception) { ... }
     }

     RealmList::class.java.isAssignableFrom(field.type) -> {
       try {
         val childList = getChildObjectByField(realmObject, field)
         childList?.let { list ->
           (list as RealmList<*>).forEach {
             if (isInstanceOfRealmObject(it)) {
               nestedObjects.add(it as RealmObject)
             }
           }
         }
       } catch (e: Exception) { ... }
     }
   }
 }

 return nestedObjects
}

private fun getChildObjectByField(realmObject: RealmObject, field: Field): Any? {
 val methodName = "get${field.name.capitalize()}"
 val method = realmObject.javaClass.getMethod(methodName)
 return method.invoke(realmObject)
}

Nekuda kweizvozvo, mune yedu mutengi kodhi tinoshandisa "cascading delete" kune yega yega data modification operation. Semuenzaniso, kune yekuisa oparesheni inoita seizvi:

override fun <T : Entity> insert(
 entityInformation: EntityInformation,
 entities: Collection<T>): Collection<T> = entities.apply {
 realmInstance.cascadeDelete(getManagedEntities(entityInformation, this))
 realmInstance.copyFromRealm(
     realmInstance
         .copyToRealmOrUpdate(this.map { entity -> entity as RealmModel }
 ))
}

Nzira yekutanga getManagedEntities inogamuchira zvese zvakawedzerwa zvinhu, uye ipapo nzira cascadeDelete Recursively inodzima zvese zvakaunganidzwa zvinhu usati wanyora zvitsva. Isu tinopedzisira tashandisa nzira iyi mukati mekushandisa. Memory leaks muRealm yaenda zvachose. Mushure mekuita chiyero chakafanana chekutsamira kwenguva yekutanga pahuwandu hwekutonhora kwekutanga kwekushandisa, tinoona mhedzisiro.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Mutsara wegirinhi unoratidza kutsamira kweiyo nguva yekutanga application pahuwandu hwekutonhora kunotanga panguva ye otomatiki cascade kudzima kwezvinhu zvakavharirwa.

Migumisiro uye mhedziso

Iyo inogara ichikura Realm dhatabhesi yanga ichikonzera kuti application itange zvishoma nezvishoma. Isu takaburitsa chigadziriso neyedu "cascading delete" yezvinhu zvakavharirwa. Uye ikozvino tinotarisisa nekuongorora kuti sarudzo yedu yakakanganisa sei nguva yekutanga application kuburikidza ne _app_start metric.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Kuti tiongororwe, tinotora nguva yemazuva makumi mapfumbamwe toona: nguva yekumisikidza application, zvese zviri pakati nepakati uye iyo inowira pa90th percentile yevashandisi, yakatanga kudzikira uye isingachasimuke.

Iyo ngano yekuti kubviswa kwecascade muRealm kwakakunda sei pakuvhurwa kwenguva refu

Ukatarisa chati yemazuva manomwe, _app_start metric inotaridzika zvakakwana uye isingasviki 1 sekondi.

Izvo zvakakoshawo kuwedzera kuti nekusarudzika, Firebase inotumira zviziviso kana iyo yepakati kukosha kwe _app_start ichipfuura 5 masekonzi. Nekudaro, sezvatinoona, haufanirwe kuvimba neizvi, asi pinda mukati uye utarise zvakajeka.

Chinhu chakakosha nezveRealm dhatabhesi ndechekuti isiri-yehukama dhatabhesi. Pasinei nekureruka kwayo kwekushandisa, kufanana kune ORM mhinduro uye chinhu chekubatanidza, haina cascade kudzima.

Kana izvi zvikasatariswa, ipapo zvinhu zvakaiswa mudendere zvinounganidza uye "zvinodonha". Iyo dhatabhesi inokura nguva dzose, izvo zvinozokanganisa kudzikira kana kutanga kwekushandisa.

Ini ndakagovana ruzivo rwedu rwekuita nekukurumidza kudzima zvinhu muRealm, izvo zvisati zvabuda mubhokisi, asi zvave kutaurwa nezvazvo kwenguva yakareba. vanoti ΠΈ vanoti. Kwatiri, izvi zvakamhanyisa zvakanyanya nguva yekutanga application.

Zvisinei nenhaurirano nezve kutaridzika kuri kuuya kwechinhu ichi, kusavapo kwekudzima kwecascade muRealm kunoitwa nedhizaini. Kana iwe uri kugadzira chishandiso chitsva, saka funga izvi. Uye kana uri kutoshandisa Realm, tarisa kana uine matambudziko akadai.

Source: www.habr.com

Voeg