App OnStart on Canvas Power Appsien tekijöille tuttu paikka. Siellä olevat kaavat suoritetaan sovelluksen käynnistyessä. Mikä mainio paikka ladata muistiin valmiiksi kaikki tarvittava.
Mutta oikeasti se ei ole hyvä paikka ladata yhtään mitään yhtään minnekkään.
Miksei?
Mitä enemmän kaavoja OnStart:ssa suoritetaan, sitä hitaammin sovellus käynnistyy. Ja se voi lopulta käynnistyä todella hitaasti. Siis todella.
Alunperin App OnStart:iin sijoitetut kaavat suoritettiin aina ensin. Vasta tämän jälkeen jatkettiin lataamaan sovelluksen näyttöjä.
Microsoft yritti paikata hitautta sallimalla App OnStart:in suorituksen rinnakkain näyttöjen lataamisen kanssa (Use non-blocking OnStart rule).

Mikäli sovelluksesi antaa avautuessaan loppukäyttäjille harvoin ja täysin satunnaisesti mystisiä virheitä, olet saattanut törmätä juuri tähän optimointiin.
Esimerkiksi jos alustat App OnStart:ssa päivämäämärä-muuttujan ja käytät sitä aloitusnäytön gallerian suodatusehdossa (filter). Tällöin joillain suorituskerroilla Power Apps ehtii muodostaa gallerian suodatusehtoineen näytölle ennen kuin siinä käytettävä muuttuja on saanut arvon App OnStart:ssa. Virhettä tulee ja galleria näyttää tyhjää.
Tylsää. Mutta syyllinen on tämä optimointi, jonka saa pois päältä.
Microsoft on usean vuoden pyrkinyt ohjaamaan tekijöitä pois App OnStart:in käytöstä. Power Appsissa on jopa asetus, jolla koko pahuuden saa pois käytöstä (enable App.OnStart propery).

Hetken aikaa App OnStart olikin oletuksena poissa käytöstä. Mikä tietenkin aiheutti hämmenystä sen käyttööön tottuneissa tekijöissä.
Miten App OnStart:sta pääsee eroon?
Jos App OnStart:in käyttö on niin kamalaa, niin missä ja miten siellä tyypillisesti tehtävät toimet sitten tulisi tehdä?
Katsotaan.
Named Formula (experimental)
Nimetyt kaavat (named formula) ovat tavallaan vakioita. Niiden arvo määritellään yhdessä paikassa (App -> Formulas) ja niitä voi käyttää kaikkialla sovelluksessa. Niiden arvo voi kuitenkin muuttua, mikäli kaavan arvo muuttuu.
Tämän lisäksi nimetyt kaavat eroavat globaaleista muuttujista yhdellä merkittävällä tavalla. Niiden arvo lasketaan vasta kun sitä ensimmäistä kertaa tarvitaan.
Ne eivät viivästytä sovelluksen käynnistystä ja ovat alustalle kevyempiä ja helpommin optimoitavissa, kuin kaikkien rakastamat globaalit muuttujat. Hyödynnä niitä aina jos vain voit (kunhan ensin tulevat yleisesti saataville).
Tyypillisiä käyttökohteita kaavoille ovat esimerkiksi seuraavat.
Käyttöliittymään liittyvät vakiot (värit, fontit, fonttikoot jne).
MainFontSize = 10;
HeaderFontSize = 14;
MainColor = RGBA(168, 0, 0, 1) ;
SecondaryColor = RGBA(237, 237, 237, 1)
Url-parameterina saatavat arvot. Esimerkiksi avattavan tietueen tunniste (id).
ParamID = Param("Id");
Tietovarastosta noudettavat käyttäjäasetukset.
UserSettings = LookUp('User settings', Title = User().Email);
Power Appsissa nimetyt kaavat näyttävät tältä.

Kaavojen arvoja voi käyttää sovelluksessa kuin muuttujia.

Mutta kaavan arvo määritellään aina yhdessä ja samassa paikassa. Selkeyttää kummasti.
App StartScreen
Sovelluksen käynnistyessä haluamme usein päätellä, mikä sovelluksen näytöistä avautuu. Normaalisti avaamme päänäytön. Mikäli sovellus sai parametrinaan tietueen tunnisteen, siirrymmekin kyseisen tietueen esittävälle näytölle. Mikäli käyttäjä käynnistää sovelluksen ensimmäistä kertaa, ohjaamme hänet täyttämään käyttäjäprofiilinsa.
Kaikki tämä tehdään tyypillisesti App OnStart:ssa. Mutta ei pitäisi. Tätä varten on aivan oma ominaisuus, nimittäin App StartScreen. Nimensä mukaisesti siellä määritellään, mikä on sovelluksen aloitusnäyttö.
Esimerkiksi, mikäli sovellus ei saanut tietueen id:tä parametrina, siirrytään Main Screen -näytölle. Muutoin siirrytään Details Screen -näytölle.
StartScreen: If(IsBlank(ParamID), 'Main Screen', 'Details Screen')
Huomaa että käynnistysnäytön määrityksessä voi käyttää nimettyjä kaavoja. App OnStart:ssa määriteltyjä globaaleja muuttujia taas ei voi käyttää.

Näin App OnStart, App StartScreen ja App Formulas voidaan suorittaa samanaikaisesti.
Logiikka voi olla myös monimutkaisempi. Esimerkiksi mikäli käyttäjältä puuttuu profiilitiedot (ensimmäinen käyttökerta), ohjataan hänet täyttämään ne. Muussa tapauksessa siirrytään aloitusnäytölle, paitsi jos sovellus sai paramterina tietueen tunnisteen. Silloin siirrytään tietuenäytölle
StartScreen: If(IsBlank(UserSettings), 'My Profile Screen', IsBlank(ParamID), 'Main Screen', 'Details Screen')
Erillinen käynnistysnäyttö
Usein joitain toimenpiteitä jää väkisinkin App OnStart:iin suoritettavaksi. Suosittelen kuitenkin poistamaan sieltä kaiken ja tekemään oman käynnistysnäytön, jossa toimenpiteet suoritetaan.
Miksi?
- Sovellus tuntuu käynnistyvän nopeammin, kun aukeaa nopeasti oikea, organisaation tyylillä brändätty, näyttö
- Latausnäytöllä voi kertoa käyttäjälle mitä milloinkin taustalla tehdään
Miten tällainen näyttö tehdään?
Lisätään sovellukseen näyttö, jossa otsikolla kerrotaan mitä tapahtuu.

Raskas työ tehdään näytön OnVisible -tapahtumassa. Muuttujan (locIsLoadingReady) avulla kerrotaan milloin ollaan valmiita.
UpdateContext({locIsLoadingReady:false});
//Put here all operations you need to do
UpdateContext({locIsLoadingReady:true});
Lopuksi näytölle lisätään vipu (toggle), jonka oletusarvona (default) käytetään muuttujaa (locIsLoadingReady). Sen arvo vaihtuu true:ksi kun kaikkki on valmista.

Kun vipu kytketään päälle, navigoidaan aloitusnäytölle.

Lopuksi vipu-kontrolli tietenkin piilotetaan näkyvistä
Muista optimointi
Kaikki edellämainittu on toissijaista säätöä, mikäli sovelluksen käynnistyessä tehdään tarpeettomia raskaita toimenpiteitä. Esimerkiksi ladataan tietovaraston rivejä varmuuden vuoksi kokoelmiin (collection).
Lyhyesti
- Käytä kokoelmia tietovaraston tietojen säilömiseen vain mikäli se on ehdottoman välttämätöntä. Kokoelmien turha käyttö on myrkkyä!
- Älä tee sovelluksen käynnistyessä raskaita operaatioita, jotka eivät ole välttämättömiä aloitusnäytölle. Raskaat operaatiot kannattaa tehdä vasta kun on pakko. Esim näytön X avautuessa (OnVisible).
- Hyödynnä rinnakkaisia toimenpiteitä (Concurrent)
Kannustan kokeileman Power Appsin tekoa kokonaan ilman tuttua ja turvallista App OnStart:ia Se tulee nimittäin ennemmin tai myöhemmin katoamaan kokonaan.