iPhone:通过UITableView顺畅滚动

时间:2012-03-22 14:58:15

标签: iphone uitableview

我有一个UITableView,上面有自定义单元格。在单元格上我有一个UILabel,但在我将文本设置为UILabel之前,我确实在文本上做了很多努力......比如在另一个文本中查找文本,在其上突出显示一些单词,然后我将其设置为标签。因此,当我滚动列表时,由于这项艰苦的工作,它有延迟。知道如何提高性能吗?也许在另一个线程中做所有艰苦的工作?

- (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;
}

[self giveMeTheTextThatINeed] - 对需要一段时间的文本做了大量工作。

3 个答案:

答案 0 :(得分:1)

为每个单元格创建一个新线程。此线程调用[self giveMeTheTextThatINeed:indexPath],并重置单元格中的标签。我假设您无法更快地获取数据,因此您希望保持表格中的滚动并将努力工作转移到线程。线程完成后,更新单元格。您在带有缩略图图像的单元格中看到了很多,其中缩略图仅在一段时间后上传,并且是空白的或者首先有占位符。

答案 1 :(得分:0)

您是否可以预先计算您需要的值?换句话说,当应用程序启动时,开始执行“艰苦工作”(在另一个线程中),并将其存储在某个地方,这样,如果它已经准备就绪,您可以在表视图请求时抓住它。如果没有更多关于努力工作的内容以及我们正在谈论的数据的数量,那么很难回答。

我不知道只是按照你的建议在另一个线程上做了很多工作,因为你仍然需要将某些东西提供给tableView:cellForRowAtIndexPath:。我想你最初可以返回某种模板单元格,然后在完成艰苦工作时用reloadRowsAtIndexPaths:withRowAnimation:更新它。

答案 2 :(得分: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;