我有一个自定义的UITableViewCell。每个单元格都有一个独特的图像
我有一个图像加载器类。我把字典传递给ImageLoader的方法。由图像URL和其他一些信息组成的字典。当我们慢慢向下滚动UITableView时,此代码很有效。但是如果我们快速向下滚动它会有一些滞后。我需要优化我的算法。任何想法。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
[ImageLoader addImageToQueue:dictionary];
}
答案 0 :(得分:1)
我相信this tutorial会有助于回答您的问题。它涵盖了您无法顺利滚动以及如何解决问题的原因。
答案 1 :(得分:0)
drawRect
被覆盖,请注意此方法,因为文档说它是海军使用会大大减慢动画效果,找到优化绘图的方法。答案 2 :(得分:0)
使用UITableView dequeueReusableCellWithIdentifier:
这基本上意味着您不必每次都从头开始重新创建表格单元格。如果给一个单元格一个重用标识符,它将保留该单元格在内存中的位置,当你要求一个匹配该标识符的单元格时,让它出列。
由于每个单元格都有一个独特的图像,因此您最好将每个单元格的唯一标识符设置为图像中的某些内容 - 可能是图像的URL或文件名。这会占用更多的内存而不是处理和重新创建单元格,但它会减少滚动延迟,如果你的图像很小,那么内存占用量就不会那么大。
你最终可能会遇到类似的事情:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *imageURL = urlOfImageForThisCell;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:imageURL];
if(!cell)
{
cell = [self makeNewCell];
//if your reuseIdentifier is unique to each image, you only ever need to set it's image here
cell.image = imageForThisCell;
cell.reuseIdentifier = imageURL;
}
//additional cell setup here
return cell;
}
您还希望查看子类化UITableViewCell并覆盖prepareForReuse。
答案 3 :(得分:0)
我会查看Ray Wenderlich关于多线程和GCD here的教程。
如果没有看到cellForRowAtIndexPath:
或ImageLoader
代码就很难了,但我怀疑你的ImageLoader正在减慢速度,直到它提供单元格之前必须等待它完成。即使它只是从磁盘读取图像,它也应该在后台线程上异步完成,这样主线程就可以专注于平滑滚动。
答案 4 :(得分:0)
我知道这是旧的,但我推荐这篇文章: http://www.nsprogrammer.com/2013/10/easy-uitableview-buffering.html