non stiamo parlando di migliaia di righe o altro, anche se se ci fosse un modo per far salire le cose così in alto, mi piacerebbe.animare un gran numero di righe/sezioni in UITableView scarse prestazioni
Ho una tabella con 27 sezioni e 180 righe distribuite su tutte le sezioni e lo scenario in cui mi sto attualmente bloccando è quando animo le cose a uno stato di modello con solo 3 sezioni e 5 righe e (anche peggio) di nuovo indietro.
Sto eseguendo il batching di tutte le animazioni con beginUpdates/endUpdates. La mia app si blocca piuttosto per 1-2 secondi su un iphone4 mentre capisce le cose, quindi iniziano le animazioni.
Ho provato ad animare la rimozione/aggiunta di ogni riga, mantenendo le sezioni intorno (e lasciando il conteggio delle righe a 0 nel caso di rimozione) e anche animando solo la rimozione/l'inserimento delle sezioni stesse (quando il conteggio delle righe sarebbe sceso a 0). Avrei pensato che quest'ultimo avrebbe dato prestazioni migliori, ma non ha cambiato nulla.
C'è qualcosa che può essere fatto sull'app per accelerare? In questo momento ho un po 'di codice alquanto grossolano per salvare le singole animazioni se ce ne sono più di 20, optando invece solo per ricaricare i dati.
modifica codice di esempio che presenta il problema. Le prestazioni di questo codice sono leggermente migliori rispetto al codice monotouch equivalente (che è quello che stavo usando prima), ma è ancora piuttosto brutto.
#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
La mia prima ipotesi sarebbe che le celle del tavolo sono il colpevole. Stai usando celle personalizzate? – lyricsboy
Puoi pubblicare del codice? Inoltre: il tuo UITableViewCells è opaco? – Ahti
Che cosa indicano gli strumenti è il collo di bottiglia? Li stai eliminando in massa con una sola chiamata deleteRowsAtIndexPaths: ... o molte chiamate individuali? Stai chiamando reloadData nel mezzo di animazioni (non devi mai farlo)? –