2012-05-28 42 views
-1

我有一个自定义的UITableViewCell。每个单元格都有独特的图像。我需要优化UITableViewCell图片加载

我有一个图像加载器类。我将一本字典传递给了ImageLoader的方法。由图片网址和其他一些信息组成的词典。当我们慢慢向下滚动UITableView时,这段代码运行良好。但如果我们快速向下滚动,它会有一些滞后。我需要优化我的算法。有任何想法吗。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [ImageLoader addImageToQueue:dictionary]; 
} 
+0

你将不得不比发布更多的代码! –

+0

您发布的代码似乎没有任何意义。 – diegoreymendez

回答

1

我相信this tutorial会回答你们的问题是有用的。它涵盖了您无法顺利滚动以及如何解决问题的原因。

0
  • 禁用图片加载和测试表行为 - 问题可能是一个缓慢的单元初始化,如果自定义单元格drawRect被覆盖,非常重视这个方法的文档说,它的海军使用放缓动画显着,找到优化绘图的方法。
  • 如果顺利与图像加载禁用,考虑到限制并发负载操作的数量(与后面将要加载的未决操作),并使用高速缓存可用每当表滚动。
0

使用UITableView dequeueReusableCellWithIdentifier:

这基本上意味着,你不必每次都从头开始重新创建表格单元格。如果您为单元格指定一个重用标识符,它会将该单元格保留在内存中,并让您在请求与该标识符匹配的单元格时将其取出。

由于每个单元都有一个独特的形象,你可能是最好关闭设置每个单元的唯一标识符,从图像的东西 - 也许是图片的网址或文件名。这会消耗更多的内存,而不是处理和重新创建单元,但它会减少滚动滞后,并且如果图像很小,则内存占用不会太大。

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

你可能喜欢的东西而告终。

0

我想看看雷Wenderlich对多线程和GCD here教程。

很难没有看到您的cellForRowAtIndexPath:ImageLoader代码,但我有一个怀疑,你ImageLoader的放缓下来到它必须等待它完成它提供了细胞前的点。即使它只是从磁盘读取图像,它应该在后台线程来完成,异步使主线程可以专注于平稳滚动。

祝你好运!