2013-02-11 11 views
5

Chciałbym, aby mój NSTableview oparty na widoku nie używał ponownie wygenerowanych wcześniej widoków TableCellView, które są przewijane poza zakresem. Sądzę, że byłoby to możliwe z UITableView przez nadpisanie dequeueReusableCellWithIdentifier: by zwrócić zero. Ist istnieje podobne rozwiązanie dla NSTableView?Jak NSTableView nie używać ponownie TableCellViews

-

Moj Tło: Mam dość skomplikowany view-Based-tableView związany ManagedObjects w zwykły sposób (czyli zawartość tabeli, -Wybór i -sortdescriptor są zobowiązane do tych elementów arraycontroller tableCellView-a powiązanie z objectValue).

Tabela ma około 20 kolumn, ale maksymalnie 400 wierszy. Przewijanie jest bardzo powolne, ale profilowanie czasowe wskazuje, że nie istnieje jedno wolne powolne działanie (największe pojedyncze wywołanie metody zajmuje około 5% czasu). Po buforowaniu pochodnych/niestandardowych właściwości mojego ManagedObject bez większego zwiększenia wydajności, próbuję teraz buforować widoki (aby uniknąć częstego ponownego wiązania widoków tablecells, gdy widok wchodzi w zakres).

W tej chwili próbuję nie wiązać zawartości tabeli, ale uzyskać moje widoki za pomocą protokołu NSDatasource. W tym celu należy wstawić buforowane widoki TableCellView, jeśli istnieją. W przeciwnym razie utwórz nowy pośrednictwem

[self.table makeViewWithIdentifier:... owner:self]; 

Od makeViewWithIdentifier może powrócić widoki, które już są buforowane przez mnie, tabela-content dostaje pomieszane z niewłaściwych komórek.

Wydajność jest znacznie lepiej z tym podejściem ...

-

Inne pomysły dotyczące tworzenia przewijania bardziej wydajnych również appriciated.

+0

Chciałbym wiedzieć, czy masz gdziekolwiek z tym. Myślę, że mam przeciwny problem, ponieważ mój NSTableView * nie * ponownie używa komórek z jakiegoś powodu. Próbowałem PXListView, ale miało to gorszą wydajność i dużo błędów, więc chciałbym trzymać się NSTableView, ale opracowałem, jak zrobić widoki z pamięci podręcznej, które, jak sądzę, powinny robić. Jeśli chodzi o twój problem, czy byłbyś w stanie stworzyć niepowtarzalny identyfikator dla każdego widoku, czy może to spowodować straszliwe zużycie pamięci? – danpalmer

Odpowiedz

7

W Twojej tableView: viewForTableColumn: implementacja ustaw parametr .identifier na zwróconym widoku na zero. To uniemożliwi buforowanie tabeli. Następnie możesz zarządzać własną pamięcią podręczną. FWIW, nie musisz nawet używać makeViewWithIdentifier: w ogóle; możesz po prostu ręcznie tworzyć swoje widoki od zera, zamiast używać tej metody (która ładuje widoki wstępnej konfiguracji z NIB).

Jeśli jednak masz problemy z wydajnością, lepiej jest je rozwiązać, sprawdzając, co jest powolne i dlaczego. Nie dostarczyłeś informacji o powolności, więc trudno powiedzieć, co robić. 20 kolumn to dużo. Możesz uzyskać lepszą wydajność, próbując zmniejszyć liczbę warstw za pomocą metody canDrawSubviewsIntoLayer, NSTableCellView lub NSTableRowView. Jest jednak wiele zastrzeżeń i rzeczy, o których należy pamiętać podczas wykonywania tej czynności.

corbin

+0

Ponadto, podobnie jak w UIKit i dequeueReusableCellWithIdentifier: można przesłonić makeViewWithIdentifier i zaimplementować własny mechanizm buforowania (lub go przywrócić zero). –

+0

Czy mówisz, że zwrot z tableView: viewForTableColumn: służy tylko do buforowania puli ponownego użycia?Czy istnieją aktualne informacje na temat tego, ile wyświetleń będzie wyjątkowo wolno lub jak duży będzie pulę ponownego wykorzystania? Jakikolwiek sposób poznać powiązanie API przewijania widoku z przewijaniem? – uchuugaka

+1

Nie, to nie jest to, co powiedziałem. Zwrot z tableView: viewForTableColumn: jest tym samym widokiem, który tabela umieszcza w danej lokalizacji. Gdy tabela przechodzi do usunięcia widoku (ponieważ nie jest już potrzebna), jest buforowana TYLKO, jeśli identyfikator widoku nie jest zerowy. W przeciwnym razie widok zostanie wyrzucony i zwolniony. –