如何在动态UITableView上异步加载图像?

时间:2015-05-22 05:52:38

标签: ios uitableview swift asynchronous

现在我有一个带图像和标签的自定义单元格。后来我通过以下方式打印这些单元格:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:customCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! customCell

    var url = NSURL(string: postCover[indexPath.row])

    if let data = NSData(contentsOfURL: url!) { 
        cell.cellImage.image = UIImage(data: data)
    }

    var title = postTitle[indexPath.row]

    cell.cellLabel.text = title

    let indexPath = tableView.indexPathForSelectedRow()

    return cell
}

当我打开一个应用程序并滚动它冻结。我该如何修复这个错误?

我读过它,我必须在tableView中使用异步图像加载,但是我不是已经加载它们了吗?

我搜索并考虑了4-5天而没有任何事情。有人可以给我一些提示吗?

3 个答案:

答案 0 :(得分:2)

您可以使用GCD as-

为每个单元格异步下载图像
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:customCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! customCell

    var url = NSURL(string: postCover[indexPath.row])

cell.imageView.image = nil;
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue, ^(void) {

            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:parsedData[@"imageLR"]];

            UIImage* image = [[UIImage alloc] initWithData:imageData];
            if (image) {
                 dispatch_async(dispatch_get_main_queue(), ^{
                     if (cell.tag == indexPath.row) {
                         cell.imageView.image = image;
                         [cell setNeedsLayout];
                     }
                 });
             }
        });

return cell
}

对于Swift你可以这样做

if let data = self.cache.objectForKey(urlString) as? NSData {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
            let image = UIImage(data: data)
            dispatch_async(dispatch_get_main_queue()) {
                cell.imageView.image = image;
            }
        }

答案 1 :(得分:2)

您可以在gitHub上使用第三部分库SDWebImage。它基于Objective-C,还有另一个基于Swift的库Kingfisher。也许这就是你想要的。

答案 2 :(得分:0)

在swift.Import AFNetworking头文件中创建桥接头文件

然后找到这些方法setImageWithURLRequest

cell.imageView.setImageWithURLRequest您可以通过这种方式致电