2012-03-22 4 views
0

У меня есть UITableView и пользовательские ячейки на нем. В ячейке у меня есть UILabel, но до того, как я установил текст в UILabel, я действительно усердно работал над текстом ... например, найти текст в другом тексте, выделить некоторые слова на нем, и только после этого я установил его для метки. Поэтому, когда я просматриваю свой список, у него есть задержка из-за этой тяжелой работы. Есть идеи, как повысить производительность? Может быть, сделать всю тяжелую работу в другой теме?iPhone: плавный прокрутка через UITableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: 
     (NSIndexPath *)indexPath { 
static NSString *customCellIdentifier = 
    @"CellIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
    customCellIdentifier]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomTableRow" 
     owner:self options:nil]; 
    if (nib.count > 0) { 
     cell = self.customTableRow; 
    } 
} 

    self.myLabel.text = [self giveMeTheTextThatINeed]; 

return cell; 
} 

[само giveMeTheTextThatINeed] - сделал тяжелую работу по тексту, который занимает некоторое время.

ответ

1

Сделать новую тему для каждой ячейки. этот поток вызывает [self giveMeTheTextThatINeed: indexPath] и сбрасывает метки (метки) в ячейке. Я предполагаю, что вы не сможете быстрее получить свои данные, поэтому вы хотите сохранить прокрутку в таблице и открутить жесткую работу до потока. Когда поток завершен, обновите ячейку. Вы видите это много в ячейках с миниатюрным изображением, где миниатюра загружается через некоторое время и пуста или имеет место в ней.

+0

похоже, что это лучший способ. Любой учебник ho, чтобы понять это? – Jim

+0

Действительно не так много: оберните свой метод в вызовы пула потоков: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [poo release] ;, если вы не используете ARC. Затем перед запуском [pool release] ;, call - (void) reloadRowsAtIndexPaths: (NSArray *) indexPaths withRowAnimation: (UITableViewRowAnimation) анимация –

0

Любой способ прекомпопуляции значений, которые вам нужны? Другими словами, начните выполнять свою «тяжелую работу» (в другом потоке), когда приложение запустится, и сохраните его где-нибудь, чтобы, если он был готов, вы можете просто захватить его, когда его спросит табличное представление. Трудно ответить без каких-либо подробностей о том, что такое тяжелая работа и сколько данных мы говорим.

Я не знаю, как сделать тяжелую работу над другой нитью, как вы предложили, так как вам все равно нужно дать что-то до tableView:cellForRowAtIndexPath:. Я предполагаю, что вы сначала можете вернуть какую-то ячейку шаблона, а затем обновите ее с помощью reloadRowsAtIndexPaths:withRowAnimation:, когда будет проведена тяжелая работа.

0

Я считаю, что метод giveMeTheTextThatINeed должен принимать текущую ячейку в качестве одного из параметров (или другого параметра, зависящего от содержимого ячейки), например: [self giveMeTheTextThatINeed:indexPath]. В противном случае вы можете сохранить текст в качестве переменной экземпляра и установить его во всех ячейках из этой переменной.

Итак, имея это в виду, самый простой способ для хранения результата вычислений в дополнительном словаре, где indexPath (или другой параметр) будет ключом:

self.myLabel.text = [self->myDictionary objectForKey:indexPath]; 

Теперь вы может либо предварительно заполнить этот словарь, прежде чем клетки нарисованы (например, в viewWillAppear), или кэшировать их, как только они рассчитаны таким образом, чтобы они не пересчитывается, когда клетки прокручиваются, например:

NSString* calculatedText = [self->myDictionary objectForKey:indexPath]; 
if(calculatedText == nil) 
{ 
    calculatedText = [self giveMeTheTextThatINeed:indexPath]; 
    [self->myDicationary setValue:calculatedText forKey:indexPath]; 
} 
self.myLabel.text = calculatedText; 
Смежные вопросы