nie mówimy o tysiącach wierszy ani o niczym, chociaż gdyby istniał sposób na zwiększenie skali, chciałbym.animowanie dużej liczby wierszy/sekcji w UITableView słaba wydajność
Mam tabelę z 27 odcinkami i 180 rzędami rozmieszczonymi we wszystkich sekcjach, a scenariusz, w którym aktualnie utknąłem, to kiedy animuję rzeczy do stanu modelu z tylko trzema sekcjami i 5 rzędami, i (jeszcze gorzej) z powrotem.
Łączę wszystkie animacje za pomocą funkcji beginUpdates/endUpdates. Moja aplikacja całkiem nieźle blokuje się na 1-2 sekundy na iPhone4, podczas gdy on wymyśla rzeczy, a następnie zaczyna się animacja.
Próbowałem zarówno animować usuwanie/dodawanie każdego wiersza, zachowując sekcje (i zmniejszenie liczby wierszy do 0 w przypadku usuwania), a także animowanie tylko usunięcie/wstawienia samych sekcji (gdy liczba wierszy spadłaby do 0). Założę się, że ta ostatnia da lepszą wydajność, ale w niczym się nie zmieni.
Czy jest coś, co można zrobić po stronie aplikacji, aby przyspieszyć? W tej chwili mam dość gruby kod do wyskoczenia z poszczególnych animacji, jeśli jest ich więcej niż 20, decydując się na ponowne załadowanie danych.
edytuj tutaj kod, który wykazuje problem. Wydajność tego kodu jest nieco lepsza niż równoważny kod monotouch (którego używałem wcześniej), ale nadal jest dość zły.
#import "TableViewController.h"
@interface MyTableViewDataSource : NSObject<UITableViewDataSource> {
int rows;
};
@end
@implementation MyTableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (void)setRowCount:(int)r
{
rows = r;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return rows;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.text = [NSString stringWithFormat:@"row %d", indexPath.row];
return cell;
}
@end
@implementation MyTableViewController {
UIBarButtonItem *populateButtonItem;
};
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
populateButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Populate" style:UIBarButtonItemStylePlain target:self action:@selector(populateDataSource)];
}
return self;
}
- (void)populateDataSource
{
NSMutableArray* new_rows = [[NSMutableArray alloc] init];
[((MyTableViewDataSource*)self.tableView.dataSource) setRowCount:200];
for (int i = 0; i < 200; i ++)
[new_rows addObject:[NSIndexPath indexPathForRow:i inSection:0]];
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:new_rows withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.dataSource = [[MyTableViewDataSource alloc] init];
self.navigationItem.rightBarButtonItem = populateButtonItem;
}
@end
Moim pierwszym przypuszczeniem byłoby, że twoje komórki tabeli są winowajcą. Czy używasz komórek niestandardowych? – lyricsboy
Czy możesz napisać jakiś kod? Ponadto: czy twój UITableViewCells jest nieprzejrzysty? – Ahti
Co to jest wskazanie instrumentów, to wąskie gardło? Czy usuwasz je masowo za pomocą pojedynczego deleteRowsAtIndexPaths: ... call, lub wielu pojedynczych połączeń? Czy wywołasz reloadData w środku animacji (nigdy nie możesz tego zrobić)? –