重新加载自己创建的UITableViewCell

时间:2012-10-05 18:45:37

标签: iphone ios xcode uitableview

我有一个自定义的UITableViewcell,它应该在使用该代码时加载一个Image:

- (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");
    });
}

它非常快速地加载Image,所以我得到响应“test”非常快,但它需要加载到tableView中。此外,如果我选择该行,则会加载图像。

如何解决此问题?

由于

2 个答案:

答案 0 :(得分: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)初始化中初始化;你细胞的方法 2)通过视图控制器上的类方法使其成为静态对象 2)创建一个可用于表格单元格的单例实例

设计偏好取决于您,并取决于您希望保持一致的其他实践。

答案 1 :(得分:0)

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

有一个类似的问题与已接受的答案,但它也建议使用SDWebImage。看看:How to get UITableViewCell images to update to downloaded images without having to scroll UITableView