2012-06-23 10 views
6

Próbowałem rozwiązać zagadkę z ostatnich kilku dni, dlaczego mój NSFetchedResultsController z partią o wielkości 20 zawsze błędnie (czyli ładuje do pamięci) wszystkie moje obiekty natychmiast po zakończeniu pobierania spowodowało, że żądanie trwało ~ 20 sekund.Dynamiczna wysokość UITableView z obiektami Core Data

Okazuje się, że było tak, ponieważ w mojej heightForRowAtIndexPath wysokość była oparta na długości właściwości NSString każdego pobranego obiektu, a więc po ponownym załadowaniu tabeli, jeśli tabela ma 2000 wierszy, to wysokość jest obliczana dla każdego wiersza na początku, a ponieważ uzyskuję dostęp do właściwości tekstowej obiektu, spowodowałoby to błąd w 2000 obiektach (w partiach o rozmiarze 20) na samym początku, powodując, że trwało to na zawsze. (Nie wiedziałem, że wysokości rzędów zostały obliczone na samym początku).

Pytanie więc, czy mam kontroler wyników pobierania z rozmiarem partii 20, ale moje wysokości rzędów są oparte na właściwości tekstowej obiektu, co jeśli spróbuję uzyskać dostęp spowoduje, że obiekt nie będzie błąd już, ale faktycznie załadowany do pamięci, co byłoby obejściem do obliczenia wysokości?

Jakie są moje opcje?

+0

Co się stanie, jeśli sprawdzisz, czy obiekt jest błędem, jeśli jest, zwróć dowolny rozmiar, w przeciwnym razie pobierz ciąg i obliczyć? Czy metoda zostanie ponownie wywołana, gdy pojawi się komórka, aby wyświetlić? Po prostu zgaduję. To lub implementacja leniwego obciążenia (tj. Nowe wiersze są dodawane podczas przewijania) wydają się być jedynymi opcjami. – jrturton

+0

Brak heightForRow jest wywoływana tylko na początku przeładowania i nie jest wywoływana za każdym razem, gdy pojawia się komórka (np. CellForRow). Tak też myślałem, ale nie sądzę, żeby to zadziałało. – Snowman

+0

Pomyślałem, że to brzmi zbyt łatwo. – jrturton

Odpowiedz

2

Interesujące pytanie. Co mogę zrobić, aby zwiększyć wydajność, to stworzyć właściwość w twoim modelu, która będzie przechowywać długość tego tekstu. W ten sposób nie musisz obliczyć długości dla każdego wiersza w locie, ale masz wstępnie obliczoną wysokość.

Myabe mogą istnieć inne cenne rozwiązania.

+0

Ale nadal potrzebowałbym uzyskać dostęp do tej właściwości liczby całkowitej, która spowodowałaby, że obiekt nie był już wadą i został wczytany do pamięci .. – Snowman

+1

@mohabitar To nie do końca prawda. Jeśli pobierzesz tę właściwość do żądania pobierania, a następnie uzyskasz do niej dostęp, tekst ciągu nie zostanie załadowany do pamięci, dopóki nie zażądasz tego, w przeciwnym razie właściwość tekstu pozostanie jako błąd. –

+0

W prawo, ale kiedy mam dostęp do właściwości string, obiekt, który trzyma ciąg, jest ładowany do pamięci (ponieważ był to błąd wcześniej, nieprzypisany). – Snowman

-1

Utwórz metodę statyczną w klasie kontrolera widoku, która jest odpowiedzialna za obliczanie wspomnianej wysokości. Wszystko, czego potrzebujesz, aby dostarczyć tę funkcję, to NSString i powinna zwracać łatwo obliczoną wartość CGFloat. Użyj tej metody, aby zwrócić wymaganą wysokość swoich elementów bez tworzenia ich instancji (wszystko, czego potrzebujesz, to metadane z ich tekstu).

+0

Dobrze, ale w jaki sposób metoda będzie wiedzieć, czym jest NSString bez tworzenia instancji obiektów? NSString jest właściwością obiektu, a jeśli obiekt jest błędem, wywołanie object.textProperty powoduje, że obiekt jest ładowany do pamięci. – Snowman

+0

Ten problem dotyczy twojej implementacji. Może obejście tego łańcucha bez tworzenia instancji? To jest kurczak i jajko :) – Stavash

Powiązane problemy