Ios 在tableView上滚动太慢了
我有一个tableview,它后面有图像和文本,我创建了如下代码所示的单元格:Ios 在tableView上滚动太慢了,ios,Ios,我有一个tableview,它后面有图像和文本,我创建了如下代码所示的单元格: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCel
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
NSDictionary * companyProductRow = [DB getCompanyProductRow:[self.companyProductIDs objectAtIndex:indexPath.row]];
int companyProductID = [[companyProductRow objectForKey:@"ID"] intValue];
cell.tag = companyProductID;
cell.textLabel.text = [companyProductRow objectForKey:@"ImagePath"];
NSString* fullPath = [FileManager fullPath:companyProductID fairDirectory:[[self.currentFair objectForKey:@"ID"]intValue]];
[[cell imageView] setImage:[UIImage imageWithContentsOfFile:fullPath]];
return cell;
}
我在苹果开发者网站上读到了一些关于tableview性能的提示,但他们都说:
重复使用细胞。对象分配有一个性能代价,特别是当分配必须在短时间内重复进行时,比如当用户滚动表视图时。如果重用单元而不是分配新单元,则可以极大地提高表视图的性能。
避免重播内容。在使用自定义子视图重用单元格时,不要在每次表视图请求单元格时布局这些子视图。创建单元时,将子视图布置一次。
使用不透明子视图。自定义表视图单元格时,使单元格的子视图不透明而非透明
apple站点中的示例是相同的,但我想知道在uitableview上滚动时是否有更好的性能?(当我们应该从磁盘读取映像时)
所以谢谢是的,是的。您可以增强的第一件事是图像加载。
尽量避免使用
[UIImage imageWithContentsOfFile:fullPath]
,因为它总是将整个图像加载到内存中。这实际上是缓慢的。请改用[UIImage ImageName:“YOUR_IMGAES_NAME”]
,因为它会在首次使用后缓存图像,或者直接将图像预加载/存储在您的fileManager中
下一步是将单元格中的所有视图设置为nil
(与imageView类似),并手动绘制所有内容。原因是,ui视图
速度非常慢。如果你有很多标签、图像等要显示,那么用手画所有东西会快得多。是的。您可以增强的第一件事是图像加载。
尽量避免使用
[UIImage imageWithContentsOfFile:fullPath]
,因为它总是将整个图像加载到内存中。这实际上是缓慢的。请改用[UIImage ImageName:“YOUR_IMGAES_NAME”]
,因为它会在首次使用后缓存图像,或者直接将图像预加载/存储在您的fileManager中
下一步是将单元格中的所有视图设置为
nil
(与imageView类似),并手动绘制所有内容。原因是,ui视图
速度非常慢。如果要显示大量标签、图像等,则手动绘制所有内容的速度要快得多。您的表格视图:cellForRowAtIndexPath:
看起来它要为每个单元格执行两次磁盘读取,一次从[DB getCompanyProductRow:…]
中读取,我假设这是某种数据库获取,第二个来自[UIImage imageWithContentsOfFile:…]
在调用tableView:cellforrowatinexpath:
之前(最好在[tableView reloadData]
之前),找到将这些信息加载到内存的方法
大型数据集提示:
如果需要获取的数据太大,无法将内存加载到数组中,请尝试实现一些分页机制,以便只需要显示该数据的子集。我甚至建议您使用核心数据的
NSFetchedResultsController
,但前提是您的数据库结构与对象模型兼容。您的表格视图:cellForRowAtIndexPath:
看起来好像在对每个单元格进行两次磁盘读取,一次从[DB getCompanyProductRow:…]
我假设它是某种类型的数据库获取,第二个来自[UIImage imageWithContentsOfFile:…]
在调用tableView:cellforrowatinexpath:
之前(最好在[tableView reloadData]
之前),找到将这些信息加载到内存的方法
大型数据集提示:
如果需要获取的数据太大,无法将内存加载到数组中,请尝试实现一些分页机制,以便只需要显示该数据的子集。我甚至建议您使用Core Data的
NSFetchedResultsController
,但前提是您的数据库结构与对象模型兼容。谢谢您的回复,您能解释更多吗,图像在磁盘上,我有完整的图像路径,我认为路径不适用于“imageNamed”?如果你的图像很小(我认为是tableViewCell),我会在应用程序启动时将它们全部加载到内存中。只需创建一个数组,并将带有imageWithContentsOfFile:
的图像加载到该数组中。一个很好的地方就是你的文件管理器。但我宁愿将所有图像添加到项目中,仍然使用[UIImage imageNamed:][/code>。感谢您的回复,您能解释更多信息吗,这些图像都在磁盘上,我有完整的图像路径,我认为路径不适用于“imageNamed”?如果你的图像很小(我认为是tableViewCell),我会在应用程序启动时将它们全部加载到内存中。只需创建一个数组,并将带有imageWithContentsOfFile:
的图像加载到该数组中。一个很好的地方就是你的文件管理器。但我宁愿将所有图像添加到项目中,并且仍然使用[UIImage imagename:::
。