Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在tableView上滚动太慢了_Ios - Fatal编程技术网

Ios 在tableView上滚动太慢了

Ios 在tableView上滚动太慢了,ios,Ios,我有一个tableview,它后面有图像和文本,我创建了如下代码所示的单元格: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCel

我有一个tableview,它后面有图像和文本,我创建了如下代码所示的单元格:

- (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:::