Sztuczki poprawiające wydajność przewijania UITableView iPhone ' a?

Mam uitableview, który ładuje dość duże obrazy w każdej komórce, a wysokość komórek różni się w zależności od rozmiaru obrazu. Wydajność przewijania jest przyzwoita, ale czasami może być szarpana.

Znalazłem te wskazówki, które znalazłem na blogu FieryRobot:

Glassy-scrolling-with-uitableview

Więcej-glassy-scrolling-with-uitableview

Czy ktoś ma jakieś wskazówki dotyczące poprawy wydajności przewijania uitableview?

Author: NANNAV, 2009-08-30

5 answers

  1. buforuj wysokość wierszy (widok tabeli może tego często żądać)
  2. Utwórz najmniej ostatnio używaną pamięć podręczną dla obrazów używanych w tabeli (i Unieważnij wszystkie nieaktywne wpisy, gdy otrzymasz ostrzeżenie o pamięci)
  3. Rysuj wszystko w UITableViewCell's drawRect: jeśli to możliwe, unikaj podglądy za wszelką cenę (lub jeśli potrzebujesz standardowej funkcji dostępności, widoku zawartości drawRect:)
  4. utwórz warstwę UITableViewCell nieprzezroczystą (to samo dotyczy widoku zawartości, jeśli mieć)
  5. Użyj funkcji reusableCellIdentifier zgodnie z zaleceniami UITableView przykłady / dokumentacja
  6. unikaj gradientów/skomplikowanych efektów graficznych, które nie są wstępnie przygotowane na UIImage s
 152
Author: rpetrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-29 22:57:59
  1. Jeśli podklasujesz UITableViewCell, nie używaj Stalówki, zamiast tego napisz kod. To dużo szybsze niż ładowanie plików Nib.
  2. Jeśli używasz obrazów, upewnij się, że buforujesz je więc nie trzeba ładować z pliku więcej niż raz dla każdego (jeśli masz pamięć-zdziwiłbyś się, jak dużo miejsca zajmują zdjęcia).
  3. Uczyń tyle elementów nieprzezroczystych, ile możliwe. Podobnie, spróbuj nie i użyj obrazy z przezroczystością.
 40
Author: Shaggy Frog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-29 22:11:20

Programista stojący za Tweetie napisał o tym obszernie i ma jakiś kod, który demonstruje, jak to zostało zrobione dla tej aplikacji. Zasadniczo zaleca jeden niestandardowy widok na komórkę tabeli i rysowanie go ręcznie(zamiast podglądu za pomocą narzędzia Interface Builder, między innymi).

Fast-scrolling-in-tweetie-with-uitableview

Ponadto Apple zaktualizowało własny przykładowy kod TableView w samouczkach TableViewSuite (może w odpowiedzi na to?)

TableViewSuite

 34
Author: beno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 11:53:09

#1 performance killer dla przewijania UITableView polega na rysowaniu cieni na dowolnej warstwie widoku komórki, więc jeśli przewijanie ma znaczenie, nie rób cieni, chyba że zasadniczo nie spowalnia to głównego wątku.

Myślałem, że trzeba to powiedzieć, ponieważ żadna z zaakceptowanych odpowiedzi nie wspomina o cieniach i warstwach. :+)

 1
Author: believesInSanta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 06:09:42

Każdy problem z wydajnością przewijania można rozwiązać za pomocą technik opisanych już w innych odpowiedziach. Jednak niejednokrotnie słaba wydajność jest spowodowana czymś z natury błędnym lub powtarzalnym.

Fakt, że UITableView ponownie wykorzystuje komórki i fakt, że każda komórka może potrzebować własnego obrazu-razem sprawia, że rozwiązanie jest skomplikowane. Z tego, jak to jest rozwiązywane w sposób ogólny, tutaj podsumowuję rzeczy, które powinny być załatwione: {]}

  1. załaduj dane do źródło danych-z REST / bazy danych. Ten krok powinien być wykonany w tle, ostatecznie używając dispatch_async wraz z kolejką GCD.
  2. Tworzenie i inicjalizacja odpowiednich obiektów modelu danych i umieszczanie ich wewnątrz tablicy
  3. [tableView reloaddata]
  4. wewnątrz cellForRowAtIndexPath zawiera kod, który ustawi dane (tekst) z właściwego obiektu modelu danych tablicy.
  5. Teraz obrazy mogą być również w formie adresu URL, więc ten krok może być trochę dziwaczny z powodu ponownego użycia komórek przez Widok tabeli. The heart of the faktem jest, aby ponownie załadować obraz z pamięci podręcznej / URL urządzenia za pomocą kolejki asynchronicznej, a następnie ustawić go na poprawną komórkę.obraz (niezależnie od właściwości obrazu komórki).

Aby uniknąć problemów, zapoznaj się z tym samouczkiem o leniwym ładowaniu obrazów wewnątrz widoku tabeli.

 0
Author: Nirav Bhatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-16 13:23:23