6

Gdy użytkownik pisze, pobieram wyniki (tekst), przechodząc przez lokalny wykres słów w wątku tła. Każde naciśnięcie klawisza anuluje poprzednią operację. Jeśli operacja zostanie zakończona, źródło danych zostanie zaktualizowane, a reloadData zostanie wywołany w głównym wątku. Działa to świetnie i jest bardzo szybkie (tak szybko, jak użytkownik może pisać), nawet gdy zwrócono dziesiątki tysięcy wyników.Jak poprawić wydajność UICollectionView przy niestandardowych rozmiarach komórek?

Aby dostosować rozmiar każdej komórki widoku kolekcji, zaimplementowałem sizeForItemAtIndexPath dla delegata UICollectionViewDelegateFlowLayout. Niestety, powoduje to małe, ale zauważalne opóźnienie, gdy użytkownik wpisze. Aby upewnić się, że czas nie został utracony w logice obliczania wielkości, próbowałem po prostu zwrócić ustalony rozmiar, ale nadal zabijał wydajność. Jestem tym zaskoczony, ponieważ w danym momencie na ekranie jest tylko około 120 komórek. Podczas komentowania tej metody czas reakcji jest natychmiastowy, nawet w przypadku bardzo dużych zestawów danych.

Wszelkie pomysły na poprawę wydajności UICollectionView z niestandardowymi rozmiarami komórek?

Dzięki

dodatkowe wyjaśnienie ...

Program powraca wszystkich możliwych słów z podanego zestawu liter następnie sortuje wg oceny lub alfabetycznie etc. Jako typów użytkowników, całkowita liczba słów idzie w górę szybko (wykładniczo, jeśli wprowadzono wiele symboli wieloznacznych). Słowa zmieniają się podczas wpisywania, więc szerokość komórek jest odpowiednio aktualizowana i zawijana do następnego wiersza obsługiwanego przez układ przepływu.

Problem wydaje się być liczbą komórek wyświetlanych na ekranie w danym momencie. W sizeForItemAtIndexPath, jeśli po prostu zwracam duży rozmiar, w którym widoczna jest tylko jedna lub dwie komórki, aktualizacja jest bardzo szybka; jednak jeśli zwrócę rozmiar, który pasuje do tekstu, kończę z ponad 100 widocznymi komórkami i pojawia się opóźnienie. Jeśli skomentuję sizeForItemAtIndexPath i po prostu użyję komórki o ustalonym rozmiarze, jest to szybkie, ale nie o to mi chodzi.

+0

Czy chcesz, aby komórki zmieniały rozmiar podczas pisania lub po prostu miały ustalone niestandardowe rozmiary? –

+0

Próbujesz zrozumieć, dlaczego nazywasz 'reloadData' zamiast tylko aktualizować komórki na ekranie. –

+0

Dodatkowe wyjaśnienie dodane powyżej ... Szerokość komórek zmienia się zgodnie z typem użytkownika. Jak mam to zrobić bez wywoływania reloadData? – Bama91

Odpowiedz

2

Nie trzeba przeładować UICollectionView wywołując reloadData, zamiast można użyć:

[self.collectionView reloadItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; 

Tutaj indexPath jest NSIndexPath obiekt dla odpowiedniej UICollectionViewCell obiektu , który chcesz zaktualizować.

+0

Podoba mi się pomysł przechodzenia między danymi za pomocą metody insertItemsAtIndexPaths lub reloadItemsAtIndexPaths, co daje mi możliwość sprawdzenia, czy NSOperation jest wywołana (tj. Użytkownik wpisał nową literę). Do tej pory nie byłem w stanie tego zrobić. Spróbuję jeszcze raz dziś wieczorem ... – Bama91

+0

Jak rozumiem, cały układ zmienia wygląd, więc nie można po prostu ponownie załadować wybranych elementów. Układ musi zostać unieważniony. –

+0

Nadal nie widzę, jak mogę uniknąć ponownego ładowania danych, biorąc pod uwagę, że całe źródło danych (lista słów) zmienia się przy każdym naciśnięciu klawisza (w tym szerokości komórki). Oto ogólny przebieg mojego programu: 1. textDidChange anuluje wszystkie operacje, 2. dodaje NSOperation do kolejki (tylko 1 współbieżny), 3. sposób wywołania operacji, aby znaleźć słowa z liter w tle (przerywane, jeśli anulowane), 4. aktualizuje źródło danych z odnalezionymi słowami (jeśli nie jest anulowane), 5. reloadData w głównym wątku (jeśli nie jest anulowane). – Bama91

Powiązane problemy