Znasz to uczucie? Odpalasz apkę, chcesz szybko sprawdzić jedną rzecz, a zamiast tego wita Cię kręcące się w nieskończoność kółko ładowania. Użytkownik wkurzony, Ty jako deweloper też, bo przecież na Twoim super szybkim Wi-Fi w biurze wszystko śmigało. Prawda jest taka, że aplikacje mobilne żyją i umierają dzięki swojej wydajności, a kluczowym polem bitwy jest komunikacja z API. Dziś na luzie, ale konkretnie, pogadamy o tym, jak sprawić, by Twoja apka była demonem prędkości, a nie ślimakiem na wiecznych wakacjach.
- Mądre pobieranie danych – mniej znaczy więcej
- Pamięć podręczna (caching) – Twój najlepszy przyjaciel
- Paginacja – serwuj dane w lekkostrawnych porcjach
Mądre pobieranie danych – mniej znaczy więcej
Podstawowy błąd, który widzę zbyt często, to traktowanie endpointu API jak szwedzkiego stołu i nakładanie na talerz wszystkiego, co popadnie. Aplikacja mobilna jest na diecie – potrzebuje tylko konkretnych, niezbędnych składników. Im mniej danych musi przetrawić, tym szybciej zadziała i zużyje mniej cennego transferu danych.
Nie ściągaj całego Internetu na raz
Załóżmy, że pobierasz listę użytkowników do wyświetlenia w apce. Potrzebujesz tylko awatara i nazwy użytkownika. Tymczasem API zwraca Ci cały obiekt z historią logowań, listą uprawnień i ulubionym kolorem każdego z nich. To gigantyczne marnotrawstwo!
Zawsze proś API tylko o te pola, których faktycznie potrzebujesz w danym widoku. Jeśli backend na to pozwala (np. przez GraphQL albo parametry w REST API typu `?fields=name,avatar`), korzystaj z tego bez wahania. Różnica w czasie odpowiedzi i zużyciu danych potrafi być kolosalna.
Grupuj zapytania, kiedy to możliwe
Każde osobne zapytanie HTTP to dodatkowy narzut: nawiązanie połączenia, handshake SSL, nagłówki. Jeśli na jednym ekranie musisz wyświetlić dane profilu użytkownika, jego ostatnie posty i komentarze, odpalanie trzech osobnych zapytań to proszenie się o kłopoty. Szczególnie na wolniejszym połączeniu komórkowym.
Lepszym podejściem jest „batching”, czyli grupowanie. Porozmawiaj z backendowcami o stworzeniu dedykowanego endpointu, który za jednym zamachem zwróci wszystkie potrzebne dane. Jedno duże zapytanie jest prawie zawsze lepsze niż kilka małych.
Pamięć podręczna (caching) – Twój najlepszy przyjaciel
Po co pytać serwer o to samo sto razy? Jeśli dane nie zmieniają się co sekundę, zapisywanie ich lokalnie jest absolutnym musem. Caching to Twój osobisty superbohater, który ratuje aplikację przed niepotrzebną pracą.
Najszybsze zapytanie do API to takie, którego nigdy nie wykonano.
Strategie i rodzaje cache’owania
Cache może mieć różne formy, a wybór zależy od potrzeb. Najpopularniejsze to:
- Cache w pamięci (In-memory): Ultraszybki, ale ulotny. Dane znikają po zamknięciu aplikacji. Idealny dla danych potrzebnych w trakcie jednej sesji.
- Cache na dysku (On-disk): Wolniejszy, ale trwały. Dane przeżyją restart aplikacji. Świetnie nadaje się do przechowywania np. zdjęć profilowych, danych konfiguracyjnych czy treści, które rzadko się zmieniają.
Kluczem jest inteligentna strategia unieważniania cache’u. Musisz wiedzieć, kiedy dane są już nieaktualne i trzeba je odświeżyć. Można to robić na podstawie czasu (np. dane są ważne przez 5 minut) albo akcji użytkownika (np. po dodaniu nowego posta, lista postów musi zostać pobrana na nowo).
Paginacja – serwuj dane w lekkostrawnych porcjach
Wyobraź sobie, że Twoja aplikacja ma wyświetlić listę 10 000 produktów. Pobranie wszystkiego na raz to gwarantowany „out of memory error” i zamrożenie interfejsu na długie sekundy. Nikt nie ma na to czasu. Rozwiązaniem jest paginacja, czyli serwowanie danych w małych, lekkostrawnych paczkach.
Offset vs Cursor – wybierz mądrze
Zasadniczo mamy dwa główne podejścia do paginacji:
- Paginacja oparta na offsecie (offset-based): Prosisz o `20` elementów, pomijając pierwsze `40` (`/items?limit=20&offset=40`). Proste w implementacji, ale ma wady. Jeśli w międzyczasie na początku listy pojawi się nowy element, cała lista się przesuwa i możesz zobaczyć duplikaty lub pominąć niektóre pozycje.
- Paginacja oparta na kursorze (cursor-based): Prosisz o `20` elementów, które pojawiły się *po* ostatnim elemencie, który widziałeś (`/items?limit=20&after=item_id_123`). Jest to znacznie bardziej niezawodne rozwiązanie dla dynamicznie zmieniających się list, jak feed w mediach społecznościowych.
Dla większości nowoczesnych aplikacji z nieskończonym skrolowaniem paginacja oparta na kursorze jest zdecydowanie lepszym wyborem.
Pamiętaj, optymalizacja to proces. Zastosowanie tych trzech technik – mądrego pobierania danych, agresywnego cachingu i paginacji – to solidny fundament, który sprawi, że Twoi użytkownicy pokochają responsywność Twojej aplikacji. A teraz do dzieła, niech te loading spinnery odejdą w zapomnienie!

Dodaj komentarz