Ну, я как-то справился со своей проблемой. Вот мои идеи и мысли, как я пришел к решению. Может быть, это кому-нибудь пригодится.
Я дал инструкции по распределению памяти и стеку вызовов с помощью инструментов во время открытия раздела. Это показало мне, что большая часть времени уходит на загрузку ячейки из nib-файла.
Во-первых, я только что уменьшил размер файла пера , то есть минимизировал количество представлений, используемых в пользовательской ячейке табличного представления (теперь это только 2 представления и 2 метки вместо 6 представлений, 2 изображения и 2 этикетки до). Это дало мне некоторое улучшение в загрузке клеток. Документация Apple предлагает использовать как можно меньше просмотров и не использовать прозрачность. Так что будьте внимательны к этим предложениям.
Во-вторых, как я обнаружил ранее, что видны не все ячейки, созданные -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)
, я решил каким-то образом уменьшить количество загрузок новых ячеек из файла nib. Чтобы достичь этого, я пришел к простой идее: вернуть пустые ячейки по умолчанию для невидимых строк, а загрузить пользовательские ячейки из перьев для видимых. Вот кусок кода:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self index:indexPath isInvisibleInTableView:tableView])
return [self getBlankCellForTableView:tableView];
// the rest of the method is the same
...
}
-(BOOL)index:(NSIndexPath*)indexPath isInvisibleInTableView:(UITableView*)tableView
{
NSMutableArray *visibleIndexPaths = [self getExtendedVisibleIndexPathsForTableView:tableView];
return ![visibleIndexPaths containsObject:indexPath];
}
-(UITableViewCell*)getBlankCellForTableView:(UITableView*)tableView
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"IVBlankCell"];
if (!cell)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"IVBlankCell"] autorelease];
return cell;
}
Как видите, я не использую просто метод -(NSArray*)indexPathsForVisibleRows
просмотра таблиц для обнаружения видимых ячеек. Вместо этого я написал свой собственный метод -(NSMutableArray*)getExtendedVisibleIndexPathsForTableView:(UITableView*)tableView
. Это было необходимо, потому что по какой-то причине при использовании -(NSArray*)indexPathsForVisibleRows
ячейки, которые находятся рядом с последней видимой ячейкой, или ячейки, предшествующие первой видимой ячейке, создавались как пустые ячейки и выглядели как пустые ячейки при прокрутке. Чтобы преодолеть это, в -(NSMutableArray*)getExtendedVisibleIndexPathsForTableView: (UITableView*)tableView
я добавляю граничные ячейки в видимые ячейки массива:
-(NSMutableArray*)getExtendedVisibleIndexPathsForTableView:(UITableView*)tableView{
NSArray *visibleIPs = [tableView indexPathsForVisibleRows];
if (!visibleIPs || ![visibleIPs count])
return [NSMutableArray array];
NSIndexPath *firstVisibleIP = [visibleIPs objectAtIndex:0];
NSIndexPath *lastVisibleIP = [visibleIPs objectAtIndex:[visibleIPs count]-1];
NSIndexPath *prevIndex = ([firstVisibleIP row])?[NSIndexPath indexPathForRow:[firstVisibleIP row]-1 inSection:[firstVisibleIP section]]:nil;
NSIndexPath *nextIndex = [NSIndexPath indexPathForRow:[lastVisibleIP row]+1 inSection:[lastVisibleIP section]];
NSMutableArray *exVisibleIndexPaths = [NSMutableArray arrayWithArray:[tableView indexPathsForVisibleRows]];
if (prevIndex)
[exVisibleIndexPaths addObject:prevIndex];
[exVisibleIndexPaths addObject:nextIndex];
return exVisibleIndexPaths;
}
Таким образом, я сократил время открытия разделов с большим количеством пользовательских ячеек, что было доказано при трассировке инструментов и их использовании во время работы с приложением.