ProHoster > Blogs > AdministrÄcija > StÄsts par to, kÄ kaskÄdes dzÄÅ”ana programmÄ Realm uzvarÄja ilgu palaiÅ”anu
StÄsts par to, kÄ kaskÄdes dzÄÅ”ana programmÄ Realm uzvarÄja ilgu palaiÅ”anu
Visi lietotÄji mobilo lietojumprogrammu Ätru palaiÅ”anu un atsaucÄ«gu lietotÄja interfeisu uzskata par paÅ”saprotamu. Ja lietojumprogrammas palaiÅ”ana prasa ilgu laiku, lietotÄjs sÄk justies bÄdÄ«gs un dusmÄ«gs. JÅ«s varat viegli sabojÄt klienta pieredzi vai pilnÄ«bÄ zaudÄt lietotÄju pat pirms viÅÅ” sÄk lietot lietojumprogrammu.
Reiz mÄs atklÄjÄm, ka lietotnes Dodo Pizza palaiÅ”ana aizÅem vidÄji 3 sekundes, bet dažiem ālaimÄ«gajiemā ā 15ā20 sekundes.
Zem griezuma ir stÄsts ar laimÄ«gÄm beigÄm: par Realm datu bÄzes pieaugumu, atmiÅas noplÅ«di, kÄ mÄs uzkrÄjÄm ligzdotos objektus, pÄc tam savedÄmies kopÄ un visu salabojÄm.
Raksta autors: Maksims KaÄinkins ā Android izstrÄdÄtÄjs Dodo Pizza.
TrÄ«s sekundes no noklikŔķinÄÅ”anas uz lietojumprogrammas ikonas lÄ«dz pirmÄs darbÄ«bas resume() ir bezgalÄ«ba. Un dažiem lietotÄjiem palaiÅ”anas laiks sasniedza 15-20 sekundes. KÄ tas vispÄr ir iespÄjams?
Ļoti īss kopsavilkums tiem, kam nav laika lasīt
MÅ«su Realm datubÄze pieauga bezgalÄ«gi. Daži ligzdoti objekti netika izdzÄsti, bet tika pastÄvÄ«gi uzkrÄti. Lietojumprogrammas palaiÅ”anas laiks pakÄpeniski palielinÄjÄs. Tad mÄs to labojÄm, un palaiÅ”anas laiks sasniedza mÄrÄ·i - tas kļuva mazÄks par 1 sekundi un vairs nepalielinÄjÄs. RakstÄ ir situÄcijas analÄ«ze un divi risinÄjumi - Ätrais un parastais.
ProblÄmas meklÄÅ”ana un analÄ«ze
MÅ«sdienÄs jebkurai mobilajai lietojumprogrammai ir Ätri jÄpalaižas un jÄbÅ«t atsaucÄ«gai. Bet tas attiecas ne tikai uz mobilo lietotni. LietotÄja pieredze mijiedarbÄ«bÄ ar pakalpojumu un uzÅÄmumu ir sarežģīta lieta. PiemÄram, mÅ«su gadÄ«jumÄ piegÄdes Ätrums ir viens no galvenajiem picu apkalpoÅ”anas rÄdÄ«tÄjiem. Ja piegÄde ir Ätra, pica bÅ«s karsta, un klientam, kurÅ” vÄlas Äst tagad, nebÅ«s ilgi jÄgaida. SavukÄrt aplikÄcijai ir svarÄ«gi radÄ«t Ätras apkalpoÅ”anas sajÅ«tu, jo, ja aplikÄcijas palaiÅ”ana aizÅem tikai 20 sekundes, tad cik ilgi bÅ«s jÄgaida pica?
SÄkumÄ mÄs paÅ”i saskÄrÄmies ar faktu, ka dažreiz lietojumprogrammas palaiÅ”ana prasÄ«ja pÄris sekundes, un tad mÄs sÄkÄm dzirdÄt citu kolÄÄ£u sÅ«dzÄ«bas par to, cik ilgi tas prasÄ«ja. TaÄu mÄs nevarÄjÄm konsekventi atkÄrtot Å”o situÄciju.
Cik ilgi tas ir? SaskaÅÄ ar Google dokumentÄcija, ja lietojumprogrammas aukstÄ palaiÅ”ana aizÅem mazÄk nekÄ 5 sekundes, tas tiek uzskatÄ«ts par āit kÄ normÄliā. Palaista Android lietotne Dodo Pizza (saskaÅÄ ar Firebase metriku _app_start) plkst aukstais starts vidÄji 3 sekundÄs - āNav lieliski, nav briesmÄ«giā, kÄ saka.
Bet tad sÄka parÄdÄ«ties sÅ«dzÄ«bas, ka lietojumprogrammas palaiÅ”ana prasÄ«ja ļoti, ļoti, ļoti ilgu laiku! SÄkumÄ mÄs nolÄmÄm izmÄrÄ«t, kas ir āļoti, ļoti, ļoti garÅ”ā. Å im nolÅ«kam mÄs izmantojÄm Firebase izsekoÅ”anu Lietotnes sÄkuma izsekoÅ”ana.
Å Ä« standarta izsekoÅ”ana mÄra laiku no brīža, kad lietotÄjs atver lietojumprogrammu, un brÄ«di, kad tiek izpildÄ«ts pirmÄs darbÄ«bas onResume(). Firebase konsolÄ Å”Ä« metrika tiek saukta par _app_start. IzrÄdÄ«jÄs, ka:
StartÄÅ”anas laiks lietotÄjiem virs 95. procentiles ir gandrÄ«z 20 sekundes (daži pat ilgÄk), lai gan vidÄjais aukstÄs palaiÅ”anas laiks ir mazÄks par 5 sekundÄm.
StartÄÅ”anas laiks nav nemainÄ«ga vÄrtÄ«ba, bet laika gaitÄ pieaug. Bet dažreiz ir pilieni. MÄs atklÄjÄm Å”o modeli, kad palielinÄjÄm analÄ«zes skalu lÄ«dz 90 dienÄm.
IenÄca prÄtÄ divas domas:
Kaut kas noplūst.
Å is ākaut kasā tiek atiestatÄ«ts pÄc atbrÄ«voÅ”anas un pÄc tam atkal noplÅ«st.
"DroÅ”i vien kaut kas ar datu bÄzi," mÄs domÄjÄm, un mums bija taisnÄ«ba. PirmkÄrt, mÄs izmantojam datu bÄzi kÄ keÅ”atmiÅu; migrÄcijas laikÄ mÄs to notÄ«rÄm. OtrkÄrt, datu bÄze tiek ielÄdÄta, kad programma tiek startÄta. Viss sader kopÄ.
Kas vainas Realm datu bÄzei
MÄs sÄkÄm pÄrbaudÄ«t, kÄ datu bÄzes saturs mainÄs lietojumprogrammas darbÄ«bas laikÄ, sÄkot no pirmÄs instalÄÅ”anas un turpmÄk aktÄ«vÄs lietoÅ”anas laikÄ. Realm datu bÄzes saturu varat apskatÄ«t, izmantojot Steto vai detalizÄtÄk un skaidrÄk, atverot failu caur Realm studija. Lai skatÄ«tu datu bÄzes saturu, izmantojot ADB, kopÄjiet Realm datu bÄzes failu:
Apskatot datubÄzes saturu dažÄdos laikos, noskaidrojÄm, ka noteikta veida objektu skaits nepÄrtraukti pieaug.
AttÄlÄ redzams Realm Studio fragments diviem failiem: pa kreisi - aplikÄcijas bÄze kÄdu laiku pÄc instalÄÅ”anas, labajÄ - pÄc aktÄ«vas lietoÅ”anas. Var redzÄt, ka objektu skaits ImageEntity Šø MoneyType ir ievÄrojami pieaudzis (ekrÄnuzÅÄmums parÄda katra veida objektu skaitu).
SaistÄ«ba starp datu bÄzes pieaugumu un palaiÅ”anas laiku
NekontrolÄta datu bÄzes izaugsme ir ļoti slikta. Bet kÄ tas ietekmÄ lietojumprogrammas palaiÅ”anas laiku? To ir diezgan viegli izmÄrÄ«t, izmantojot ActivityManager. KopÅ” operÄtÄjsistÄmas Android 4.4 logcat parÄda žurnÄlu ar virkni ParÄdÄ«to un laiku. Å is laiks ir vienÄds ar intervÄlu no lietojumprogrammas palaiÅ”anas brīža lÄ«dz aktivitÄtes renderÄÅ”anas beigÄm. Å ajÄ laikÄ notiek Å”Ädi notikumi:
SÄciet procesu.
Objektu inicializÄcija.
AktivitÄÅ”u izveide un inicializÄcija.
IzkÄrtojuma izveide.
Lietojumprogrammu renderÄÅ”ana.
Mums piestÄv. Ja palaižat ADB ar karodziÅiem -S un -W, varat iegÅ«t pagarinÄtu izvadi ar startÄÅ”anas laiku:
adb shell am start -S -W ru.dodopizza.app/.MainActivity -c android.intent.category.LAUNCHER -a android.intent.action.MAIN
Ja jÅ«s to paÅemat no turienes grep -i WaitTime laikÄ, varat automatizÄt Ŕīs metrikas apkopoÅ”anu un vizuÄli aplÅ«kot rezultÄtus. ZemÄk esoÅ”ajÄ grafikÄ parÄdÄ«ta lietojumprogrammas palaiÅ”anas laika atkarÄ«ba no lietojumprogrammas aukstÄs palaiÅ”anas reižu skaita.
TajÄ paÅ”Ä laikÄ pastÄvÄja tÄda pati saistÄ«ba starp datu bÄzes lielumu un pieaugumu, kas pieauga no 4 MB lÄ«dz 15 MB. KopumÄ izrÄdÄs, ka laika gaitÄ (ar auksto startu pieaugumu) palielinÄjÄs gan aplikÄcijas palaiÅ”anas laiks, gan datu bÄzes apjoms. MÅ«su rokÄs ir hipotÄze. Tagad atlika tikai apstiprinÄt atkarÄ«bu. TÄpÄc mÄs nolÄmÄm novÄrst ānoplÅ«desā un noskaidrot, vai tas paÄtrinÄs palaiÅ”anu.
BezgalÄ«gas datu bÄzes izaugsmes iemesli
Pirms ānoplūžuā noÅemÅ”anas ir vÄrts saprast, kÄpÄc tÄs vispÄr parÄdÄ«jÄs. Lai to izdarÄ«tu, atcerÄsimies, kas ir Realm.
Realm ir nerelÄciju datubÄze. Tas ļauj aprakstÄ«t attiecÄ«bas starp objektiem lÄ«dzÄ«gi tam, cik daudz ORM relÄciju datu bÄzu operÄtÄjsistÄmÄ Android ir aprakstÄ«tas. TajÄ paÅ”Ä laikÄ Realm saglabÄ objektus tieÅ”i atmiÅÄ ar vismazÄko transformÄciju un kartÄjumu skaitu. Tas ļauj ļoti Ätri nolasÄ«t datus no diska, kas ir Realm stiprÄ puse un kÄpÄc tÄ tiek mÄ«lÄta.
(Å Ä« raksta vajadzÄ«bÄm mums pietiks ar Å”o aprakstu. VairÄk par Realm varat izlasÄ«t vÄsumÄ dokumentÄcija vai viÅu akadÄmija).
Daudzi izstrÄdÄtÄji ir pieraduÅ”i vairÄk strÄdÄt ar relÄciju datu bÄzÄm (piemÄram, ORM datubÄzÄm ar SQL zem pÄrsega). Un tÄdas lietas kÄ kaskÄdes datu dzÄÅ”ana bieži Ŕķiet paÅ”saprotama. Bet ne valstÄ«bÄ.
Starp citu, kaskÄdes dzÄÅ”anas funkcija ir lÅ«gta jau ilgu laiku. Å is pÄrskatÄ«Å”ana Šø cits, kas saistÄ«ts ar to, tika aktÄ«vi apspriests. Bija sajÅ«ta, ka drÄ«z tas bÅ«s izdarÄ«ts. Bet pÄc tam viss pÄrvÄrtÄs stipro un vÄjo saiÅ”u ievieÅ”anÄ, kas arÄ« automÄtiski atrisinÄtu Å”o problÄmu. Bija diezgan dzÄ«vs un aktÄ«vs Å”ajÄ uzdevumÄ izvilkt pieprasÄ«jumu, kas pagaidÄm ir apturÄta iekÅ”Äjo grÅ«tÄ«bu dÄļ.
Datu noplÅ«de bez kaskÄdes dzÄÅ”anas
KÄ tieÅ”i notiek datu noplÅ«de, ja paļaujaties uz neesoÅ”u kaskÄdes dzÄÅ”anu? Ja jums ir ligzdoti Realm objekti, tie ir jÄizdzÄÅ”.
ApskatÄ«sim (gandrÄ«z) reÄlu piemÄru. Mums ir objekts 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()
Precei grozÄ ir dažÄdi lauki, ieskaitot attÄlu ImageEntity, pielÄgotas sastÄvdaļas CustomizationEntity. ArÄ« prece grozÄ var bÅ«t kombinÄta ar savu produktu komplektu RealmList (CartProductEntity). Visi uzskaitÄ«tie lauki ir Realm objekti. Ja ievietosim jaunu objektu (copyToRealm() / copyToRealmOrUpdate()) ar tÄdu paÅ”u id, tad Å”is objekts tiks pilnÄ«bÄ pÄrrakstÄ«ts. Bet visi iekÅ”Äjie objekti (attÄls, customizationEntity un cartComboProducts) zaudÄs savienojumu ar vecÄku un paliks datu bÄzÄ.
TÄ kÄ savienojums ar tiem tiek zaudÄts, mÄs tos vairs nelasÄm un neizdzÄÅ”am (ja vien mÄs tiem nepÄrprotami piekļūstam vai notÄ«rÄm visu ātabuluā). MÄs to saucÄm par "atmiÅas noplÅ«dÄm".
StrÄdÄjot ar Realm, mums ir skaidri jÄiet cauri visiem elementiem un skaidri jÄizdzÄÅ” viss pirms Å”Ädu darbÄ«bu veikÅ”anas. To var izdarÄ«t, piemÄram, Å”Ädi:
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()
}
// Šø ŠæŠ¾ŃŠ¾Š¼ ŃŠ¶Šµ ŃŠ¾Ń ŃŠ°Š½ŃŠµŠ¼
Ja jÅ«s to darÄ«sit, viss darbosies tÄ, kÄ vajadzÄtu. Å ajÄ piemÄrÄ mÄs pieÅemam, ka attÄlÄ, customizationEntity un cartComboProducts nav citu ligzdotu Realm objektu, tÄpÄc nav citu ligzdotu cilpu un dzÄÅ”anu.
Ätrs risinÄjums
PirmÄ lieta, ko mÄs nolÄmÄm darÄ«t, bija sakopt visstraujÄk augoÅ”os objektus un pÄrbaudÄ«t rezultÄtus, lai redzÄtu, vai tas atrisinÄs mÅ«su sÄkotnÄjo problÄmu. PirmkÄrt, tika izveidots vienkÄrÅ”Äkais un intuitÄ«vÄkais risinÄjums, proti: katram objektam ir jÄatbild par savu bÄrnu izÅemÅ”anu. Lai to izdarÄ«tu, mÄs ieviesÄm saskarni, kas atgrieza ligzdoto Realm objektu sarakstu:
interface NestedEntityAware {
fun getNestedEntities(): Collection<RealmObject?>
}
Un mÄs to ieviesÄm savos Realm objektos:
@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 mÄs atdodam visus bÄrnus kÄ vienotu sarakstu. Katrs pakÄrtotais objekts var arÄ« ieviest NestedEntityAware saskarni, norÄdot, ka tam ir iekÅ”Äjie Realm objekti, ko dzÄst, piemÄram, 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
)
}
}
Un tÄ tÄlÄk, objektu ligzdoÅ”anu var atkÄrtot.
PÄc tam mÄs rakstÄm metodi, kas rekursÄ«vi dzÄÅ” visus ligzdotos objektus. Metode (izgatavota kÄ paplaÅ”inÄjums) deleteAllNestedEntities iegÅ«st visus augstÄkÄ lÄ«meÅa objektus un metodi deleteNestedRecursively RekursÄ«vi noÅem visus ligzdotos objektus, izmantojot NestedEntityAware saskarni:
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()
}
}
}
MÄs to darÄ«jÄm ar visstraujÄk augoÅ”ajiem objektiem un pÄrbaudÄ«jÄm, kas noticis.
RezultÄtÄ tie objekti, kurus mÄs pÄrklÄjÄm ar Å”o risinÄjumu, pÄrstÄja augt. Un kopÄjÄ bÄzes izaugsme palÄninÄjÄs, bet neapstÄjÄs.
"NormÄls" risinÄjums
Lai gan bÄze sÄka augt lÄnÄk, tÄ tomÄr auga. TÄpÄc sÄkÄm meklÄt tÄlÄk. MÅ«su projekts ļoti aktÄ«vi izmanto datu keÅ”atmiÅu Realm. LÄ«dz ar to visu ligzdoto objektu rakstÄ«Å”ana katram objektam ir darbietilpÄ«ga, turklÄt palielinÄs kļūdu risks, jo, mainot kodu, var aizmirst norÄdÄ«t objektus.
Es gribÄju pÄrliecinÄties, ka neizmantoju saskarnes, bet vai viss darbojas pats par sevi.
Kad mÄs vÄlamies, lai kaut kas darbotos pats no sevis, mums ir jÄizmanto refleksija. Lai to izdarÄ«tu, mÄs varam iziet cauri katram klases laukam un pÄrbaudÄ«t, vai tas ir Realm objekts vai objektu saraksts:
Ja lauks ir RealmModel vai RealmList, pievienojiet Ŕī lauka objektu ligzdoto objektu sarakstam. Viss ir tieÅ”i tÄpat kÄ iepriekÅ”, tikai Å”eit tas tiks darÄ«ts pats. Pati kaskÄdes dzÄÅ”anas metode ir ļoti vienkÄrÅ”a un izskatÄs Å”Ädi:
PagarinÄjums filterRealmObject filtrÄ un nodod tikai Realm objektus. Metode getNestedRealmObjects izmantojot atspoguļojumu, tas atrod visus ligzdotos Realm objektus un ievieto tos lineÄrÄ sarakstÄ. Tad mÄs darÄm to paÅ”u rekursÄ«vi. DzÄÅ”ot, jums jÄpÄrbauda objekta derÄ«gums isValid, jo var bÅ«t, ka dažÄdiem vecÄkobjektiem var bÅ«t ligzdoti identiski objekti. LabÄk no tÄ izvairÄ«ties un, veidojot jaunus objektus, vienkÄrÅ”i izmantojiet automÄtisko ID Ä£enerÄÅ”anu.
GetNestedRealmObjects metodes pilnīga ievieŔana
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)
}
RezultÄtÄ mÅ«su klienta kodÄ mÄs izmantojam ākaskÄdes dzÄÅ”anuā katrai datu modificÄÅ”anas darbÄ«bai. PiemÄram, ievietoÅ”anas darbÄ«bai tas izskatÄs Å”Ädi:
Vispirms metode getManagedEntities saÅem visus pievienotos objektus un pÄc tam metodi cascadeDelete RekursÄ«vi dzÄÅ” visus savÄktos objektus pirms jaunu rakstÄ«Å”anas. MÄs galu galÄ izmantojam Å”o pieeju visÄ lietojumprogrammÄ. AtmiÅas noplÅ«de Realm ir pilnÄ«bÄ pazudusi. Veicot tÄdu paÅ”u starta laika atkarÄ«bas mÄrÄ«jumu no lietojumprogrammas auksto palaiÅ”anas reižu skaita, mÄs redzam rezultÄtu.
ZaÄ¼Ä lÄ«nija parÄda lietojumprogrammas palaiÅ”anas laika atkarÄ«bu no aukstÄs palaiÅ”anas reižu skaita ligzdoto objektu automÄtiskÄs kaskÄdes dzÄÅ”anas laikÄ.
RezultÄti un secinÄjumi
Arvien augoÅ”Ä Realm datubÄze izraisÄ«ja lietojumprogrammas palaiÅ”anu ļoti lÄni. MÄs izlaidÄm atjauninÄjumu ar mÅ«su paÅ”u ligzdoto objektu "kaskÄdes dzÄÅ”anu". Tagad mÄs pÄrraugÄm un novÄrtÄjam, kÄ mÅ«su lÄmums ietekmÄja lietojumprogrammas palaiÅ”anas laiku, izmantojot metriku _app_start.
AnalÄ«zei mÄs Åemam 90 dienu periodu un redzam: lietojumprogrammas palaiÅ”anas laiks, gan vidÄjais, gan lietotÄju 95. procentiles laiks, sÄka samazinÄties un vairs nepalielinÄs.
Ja skatÄties uz septiÅu dienu diagrammu, metrika _app_start izskatÄs pilnÄ«gi atbilstoÅ”a un ir mazÄka par 1 sekundi.
Ir arÄ« vÄrts piebilst, ka pÄc noklusÄjuma Firebase sÅ«ta paziÅojumus, ja _app_start vidÄjÄ vÄrtÄ«ba pÄrsniedz 5 sekundes. TomÄr, kÄ mÄs redzam, jums nevajadzÄtu uz to paļauties, bet gan tieÅ”i to pÄrbaudÄ«t.
Realm datubÄzes Ä«paÅ”Ä iezÄ«me ir tÄ, ka tÄ ir nerelÄciju datu bÄze. Neskatoties uz lietoÅ”anas vienkÄrŔību, lÄ«dzÄ«bu ar ORM risinÄjumiem un objektu saistÄ«Å”anu, tai nav kaskÄdes dzÄÅ”anas.
Ja tas netiek Åemts vÄrÄ, ligzdotie objekti uzkrÄsies un āizplÅ«dÄ«sā. DatubÄze pastÄvÄ«gi pieaugs, kas savukÄrt ietekmÄs lietojumprogrammas palÄninÄÅ”anos vai palaiÅ”anu.
Es dalÄ«jos pieredzÄ, kÄ Ätri veikt kaskÄdes objektu dzÄÅ”anu Realm, kas vÄl nav izÅemts no kastes, bet par to tiek runÄts jau ilgu laiku viÅi saka Šø viÅi saka. MÅ«su gadÄ«jumÄ tas ievÄrojami paÄtrinÄja lietojumprogrammas palaiÅ”anas laiku.
Neskatoties uz diskusiju par Ŕīs funkcijas nenovÄrÅ”amo parÄdÄ«Å”anos, kaskÄdes dzÄÅ”anas neesamÄ«ba programmÄ Realm tiek veikta pÄc dizaina. Ja veidojat jaunu lietojumprogrammu, Åemiet to vÄrÄ. Un, ja jau izmantojat Realm, pÄrbaudiet, vai jums nav Å”Ädas problÄmas.