在自定义uitableviewcell中设置图像会导致滞后

时间:2014-06-29 03:20:35

标签: ios uitableview uiimageview uiimage

我有一个uitableview,我使用自定义单元格。但是,当我滚动表格视图时,存在一些严重的滞后。当我用图像设置UIImaveView的图像属性时会发生这种情况。我正在从目录中访问图像。但由于文件IO很慢,我使用dispatch_async将图像加载到单独线程上的UIImage对象中。

然而,仍有一些滞后。当我在没有任何图像的情况下向上和向下滚动行时,滚动非常平滑。然而,当行实际上有图像时,存在滞后。动量滚动将停止,然后应用程序变得反应迟钝,然后当图像最终加载时,动量继续从中断。

我不确定导致滞后的原因。起初我以为它与图像太大有关,所以我尝试缩小它。仍然滞后。同样,如果我没有在自定义单元格中设置图像,则没有滞后。但是,当我确实设置它时,有滞后。我不知道如何解决这个问题。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    DHTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kReuseIdentifierGoalCell forIndexPath:indexPath];
    [self configureCell:cell forIndexPath:indexPath isForOffscreenUse:NO];

    return cell;
 }


- (void)configureCell:(DHTableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath isForOffscreenUse:(BOOL)offscreenUse {
    if (cell == nil) {
        return;
    }

    [cell setDelegate:self];

    PATH_TO_FILE = SQLITE_QUERY_TO_GET_PATH; //some pseudo codes

    __weak typeof(sSelf)wSelf = sSelf;
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         __strong typeof(wSelf)sSelf = wSelf;
         UIImage *unscaled_image = [UIImage imageWithContentsOfFile:PATH_TO_FILE];
         UIImage *image = [unscaled_image imageScaledToFitInSize:kCellUIImageSize];
         __weak typeof(sSelf)wSelf = sSelf;
         dispatch_async(dispatch_get_main_queue(), ^{
             __strong typeof(wSelf)sSelf = wSelf;
             DHTableViewCell *cell = (id)[sSelf.tableView cellForRowAtIndexPath:indexPath];
             if (cell) {
                 [cell.imageStored setImage:image]; //Commenting this out relieves all lag
             }
         });
     });
 }

1 个答案:

答案 0 :(得分:0)

@ Calimari328我讨厌如果把它作为答案,因为它并没有真正回答你的问题,但事实是你应该真正做的是用一个库来实现这个目标。例如SDWebImage

示例:

#import <SDWebImage/UIImageView+WebCache.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView
                            cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *MyIdentifier = @"MyIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:MyIdentifier] autorelease];
    }

    // Here we use the new provided setImageWithURL: method to load the web image
    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

    cell.textLabel.text = @"My Text";
    return cell;
}

您必须重新考虑这一点,细胞会被重复使用,这意味着每次滚动应用程序时都会尝试再次下载图像。性能如何?记忆?缓存?处理?

正如您所想的那样,它比简单的异步任务复杂得多。幸运的是,有一些开源项目可以实现这一目标。无需重新发明轮子。

请注意,如果您想编写自己的代码,我也不会宣传任何图书馆。您也可以search on the web轻松实现。