在后台线程

时间:2016-10-21 09:06:47

标签: ios swift cocoa-touch

我有一个应用程序,使用tableView显示从服务器(类似于Instagram)发送的图像。

从我得到的服务器

  • 全尺寸图片网址
  • 描述(字符串)
  • 图片宽度
  • 图像高度

我有一个自定义单元格,可以根据需要显示。

与Instagram一样,图像的高度不固定,因此单元格的高度会动态变化到图像的高度。

我从服务器获取的图像非常大,所以我将每个图像裁剪为Width - Screen's width, Height - Based of the width (keeps the ratio),如下所示:

func imageWithImage (sourceImage:UIImage, scaledToWidth: CGFloat) -> UIImage {
    let oldWidth = sourceImage.size.width
    let scaleFactor = scaledToWidth / oldWidth

    let newHeight = sourceImage.size.height * scaleFactor
    let newWidth = oldWidth * scaleFactor

    UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight))
    sourceImage.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

我的问题是tableView非常慢。所以我想到了在后台线程中加载和裁剪图像,并在加载时显示默认图像。

我已经尝试过了(使用像AlamofireKingfisher之类的SDK等...但是然后单元格的大小(UITableViewAutomaticDimension)变得一团糟(因为动态高度),滚动时图像变为错误图像,有时甚至在滚动时崩溃。

这就是为什么我在这里问,我如何在后台线程中加载单元格并保持其动态大小,正确的照片并避免崩溃?

非常感谢你先进的答案!

注意:我知道Swift和Objective-C,选择你最喜欢的:)

1 个答案:

答案 0 :(得分:1)

我建议使用Alamofire。查看this answer,提供使用Alamofire和自定义解决方案的解决方案。

编辑后评论:

为了根据图像计算单元格高度,您需要在重新加载tableView之前下载并缓存这些图像,因为heightForRowAtIndexPath将在cellForRowAtIndexPath之前调用,因此您需要在实际设置之前知道图像高度细胞的财产。 This answer就是你需要的。