1

我有一个自定义 UITableViewcell 应该在使用该代码时加载一个图像:

- (void)setImageWithURL:(NSURL *)URL
{
    dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(taskQ, ^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        imageView.image = image;
        NSLog(@"test");
    });
}

它加载图像的速度非常快,所以我得到的响应“测试”非常快,但它需要在 tableView 中加载。此外,如果我选择它加载图像的行。

我该如何解决这个问题?

谢谢

4

2 回答 2

2

只要 setImageWithURL: 被称为 cellForRowAtIndexPath 的效果,那么它应该会如您所愿地显示出来......但是,您需要调用 imageView.image = image; 在主线程上。这适用于所有与 UI 相关的任务。所以你会想要:

- (void)setImageWithURL:(NSURL *)URL
{
    dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(taskQ, ^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = image;
            NSLog(@"test");
        });
    });
}

编辑:

使用 NSOperationQueue。

创建一个操作队列作为视图控制器的成员。

    m_operationQueue = [NSOperationQueue new];
    m_operationQueue.maxConcurrentOperationCount = 1 // if you want to load images in order;

确保在视图卸载和表刷新时取消操作

    [m_operationQueue cancelAllOperations];

在 setImageWithURL 中做你的事

- (void)setImageWithURL:(NSURL *)URL
{
    [m_operationQueue addOperationWithBlock:^{
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
        dispatch_async(dispatch_get_main_queue(), ^{
            imageView.image = image;
            NSLog(@"test");
        });
    }];
}

再次编辑:

抱歉,忘记了 setImage 在您的自定义表格单元格中。您可以:

1) 使其成为您在 +(void)initialize 中初始化的静态对象;单元格的方法 2)通过视图控制器上的类方法使其成为一个静态对象 2)创建一个可用于表格单元格的单例实例

设计偏好取决于您,如果您想要保持一致,则取决于您一直在使用的其他实践。

于 2012-10-05T18:56:59.500 回答
0

下载完图像后,您应该调用 [tableView reloadData]。

有一个类似的问题有一个接受的答案,但它也有使用SDWebImage的建议。看一看:如何让 UITableViewCell 图像更新为下载的图像而无需滚动 UITableView

于 2012-10-05T18:54:04.860 回答