2013-08-28 17 views
7

Podczas korzystania z - (void)beginUpdates i - (void)endUpdates na UITableView trzeba dokonać zmian w źródle danych w rozmowach?UITableView rozpoczęcia/zakończenia aktualizacji

tj

Jeśli mam NSMutableArray nazywa dataSource jazdy mój tableView mogę to zrobić ...

// edit the actual data first 
[dataSource addObject:@"Blah"]; 

// now update the table 
[self.tableView beginUpdates]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

czy jest to konieczne, aby zrobić ...

[self.tableView beginUpdates]; 

[dataSource addObject:@"Blah"]; 

[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:dataSource.count - 1 inSection:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 

Tylko pytając, ponieważ mam kilka miejsc, w których aktualizuję i mogłem potencjalnie przenieść wspólny kod do funkcji.

Ale tylko wtedy, gdy mogę aktualizować poza wywołaniami aktualizacji.

Odpowiedz

10

Ogólnie dobrym pomysłem jest aktualizacja źródła danych pomiędzy tableView beginUpdates/endUpdates. Po wywołaniu funkcji endUpdates system operacyjny wyzwala wywołania danych źródłowych, aby uzyskać sekcje i liczbę wierszy. Jeśli w tym momencie źródło danych nie zostało zaktualizowane, może dojść do awarii niezgodności tableView.

Może to w niektórych przypadkach sprawić, że źródło danych zostanie zaktualizowane przed wywołaniem tableView beginUpdates/endUpdates, należy jednak upewnić się, że aktualizujesz źródło danych w tym samym wątku i w tej samej pętli uruchamiania. Ponieważ aktualizacje tableView muszą być wykonywane w głównym wątku, oznacza to, że musisz zaktualizować źródła danych w głównym wątku.

Jeśli zaktualizujesz źródło danych i nie od razu wykonasz swoje tableView updates (i zrobisz coś w rodzaju obracania ekranu), możesz uzyskać błąd niesprawności tableView.

+0

gdzie powinienem dodać te linie kodu- w viewdidload? lub cellforrowatindexpath? lub jakiejkolwiek innej metody? –

+0

Jest to bardzo ważne "musisz upewnić się, że aktualizujesz źródło danych w tym samym wątku" – Siyavash

+0

@Siyavash, w jaki sposób mogę to zrobić? Mam kilku delegatów aktualizujących źródło danych, jak upewnić się, że im aktualizuję je w tym samym wątku. – titan

2

Zawsze stosowałem pierwsze podejście i nie powoduje to problemu. upewnij się, że po zmianie źródła danych natychmiast zaktualizuj tabelę.

2

Nie istnieje żadna reguła stwierdzająca, że ​​aktualizacje źródeł danych muszą należeć do połączeń początkowych/końcowych. Upewnij się, że po aktualizacji źródła danych wstawiasz/usuniesz wiersze zgodnie z wymaganiami, aby nie dzielić problemów w dłuższej perspektywie.

3

Natknąłem się również na to i nie wiem, jaki jest najlepszy sposób. Jednak oficjalny dokument, Table View Programming Guide, zawiera pewne informacje na ten temat. W „przykładem dozowanego wstawiania i usuwania operacji”, to wymienić:

Aby włożyć i usunąć grupę wierszy i sekcje, w widoku tabeli najpierw przygotować tablicy (tablice), które są źródło danych dla sekcji i wierszy. Po usunięciu i wstawieniu wierszy i sekcji wynikowe wiersze i sekcje zostaną wypełnione z tej składnicy danych.

Mam nadzieję, że to pomoże. I chcę się tego lepiej nauczyć, jeśli ktoś może lepiej to wyjaśnić.