将UIImages数组扩展到指定的百分比会导致UI在几秒钟内无响应?

时间:2017-04-23 19:20:53

标签: ios swift uiimage

目前,我有2个高分辨率UIImages数组,我试图将其缩小到原始分辨率的30%,并在UITableView中重新加载其内容。我正在使用Leo Dabus answer下面的扩展来缩小图像:

extension UIImage {
    func resized(withPercentage percentage: CGFloat) -> UIImage? {
        let canvasSize = CGSize(width: size.width * percentage, height: size.height * percentage)
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: canvasSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

当调用viewWillAppear时,我遍历两个数组,并将数组中的每个图像缩小到30%,然后重新加载表视图:

override func viewWillAppear(_ animated: Bool)
{
    DispatchQueue.main.async {

        for index in 0..<self.arrayOne.count
        {
            self.arrayOne[index].image = self.arrayOne[index].image?.resized(withPercentage: 0.3)
        }

        for index in 0..<self.arrayTwo.count
        {
            self.arrayTwo[index].image = self.arrayTwo[index].image?.resized(withPercentage: 0.3)
        }   
    }

    self.tableView.reloadData()
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    ...

    let cellImage = cell.viewWithTag(1) as! UIImageView

    var image: UIImage = UIImage()

    if test1 == true
    {
        if let theImage = arrayOne[index].image
        {
            image = theImage
        }        
    }
    else
    {
        if let theImage = arrayTwo[index].image
        {
            image = theImage
        }
    }

    cellImage.image = image

    return cell
}

调用viewWillAppear时,我的表视图的所有数据都会正常加载,但是整个用户界面冻结的时间间隔为2-3秒,并且没有任何响应触摸。在那个延迟之后,响应性再次出现并且没问题。

我确定它与我的缩放功能有关,每次必须缩放高分辨率图像时会执行繁重的工作,导致UI暂时无响应,但我不知道如何解决这个问题。

如何解决此初始UI无响应问题?

感谢。

1 个答案:

答案 0 :(得分:0)

冻结的原因是主线程用于维护UI,如果你在其中运行硬计算,它将冻结你的应用程序。 所以你应该像在代码片段中一样在后台运行你的循环,并在主线程中结束更新你的UI之后:

DispatchQueue.global(qos: .background).async {

    for index in 0..<self.arrayOne.count
    {
        self.arrayOne[index].image = self.arrayOne[index].image?.resized(withPercentage: 0.3)
    }

    for index in 0..<self.arrayTwo.count
    {
        self.arrayTwo[index].image = self.arrayTwo[index].image?.resized(withPercentage: 0.3)
    }  

    DispatchQueue.main.async {
       self.tableView.reloadData()
   }
}

编辑: Here不同QoS的描述。