我有一个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] - 对需要一段时间的文本做了大量工作。
答案 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;