Я разработчик Android, работающий над моим первым проектом iOS. У меня есть UITableView, который отображает почти 37 500 строк. Один ряд для каждого предмета в продуктовом магазине. Список содержит 3 столбца, содержащие имя элемента, а остальные 2 содержат другие важные данные. Столбцы сортируются, и для обработки сортировки я сортирую массив данных, как мне нужно, и вызываю [tableView reloadData]
после того, как я закончил сортировку массива. Это прекрасно работает, за исключением того, что существует длительная задержка, по крайней мере, через несколько секунд после перезагрузки данных, где основной поток заблокирован, выполняя работу. Я не чужой, чтобы перечислять производительность, поскольку мне приходилось делать плавные списки много раз в Android. Поэтому из того, что я могу сказать, я не очень много делаю, чтобы это сделать. Единственное, о чем я могу думать, это просто большое количество элементов в моем массиве. Вот соответствующий код:Проблема с производительностью UITableView после вызова reloadData
Вот методы табличного я переопределяю:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.data count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"CustomCell";
ReplenishListCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[ReplenishListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
NSMutableDictionary *dictData = [self.data objectAtIndex:indexPath.row];
cell.nameLabel.text = dictData[@"item-description"];
cell.firstLicationColumnLabel.text = dictData[@"store-count"];
cell.secondLicationColumnLabel.text = dictData[@"other-count"];
return cell;
}
-(void)tableView:(UITableView *)replenishTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self showActivityIndicator];
ReplenishListCell *cell = (ReplenishListCell*) [replenishTableView cellForRowAtIndexPath:indexPath];
NSString *nameClicked = cell.nameLabel.text;
[database getItemByName:nameClicked :self];
}
Вот метод я использую для сортировки массива:
-(void) sortArray:(NSString *) dictionaryKey {
NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:dictionaryKey ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
NSArray *sortedArray = [data sortedArrayUsingDescriptors:sortDescriptors];
[data removeAllObjects];
[data addObjectsFromArray:sortedArray];
[self.tableView reloadData];
}
я не имеют проблем с производительностью до тех пор, пока не вызывают [self.tableView reloadData]
. Поэтому мне интересно, есть ли что-то, чего я не хватает, или, может быть, лучший способ перезагрузить данные, кроме reloadData
? Любая помощь будет оценена. Я потратил несколько часов на отладку и Google, и я еще не придумал решение.
Является ли порядок вашего массива важным? –
Вы должны сначала прокомментировать свой код с помощью инструментов и найти фактического виновника. Затем, и только тогда вы можете принять обоснованное решение о том, как подойти к проблеме. – CouchDeveloper
Массив может быть отсортирован пользователем ... поэтому, когда они нажимают кнопку сортировки, тогда заказывайте вопросы –