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?
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
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
Pomyślałem, że to brzmi zbyt łatwo. – jrturton