目前,我有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无响应问题?
感谢。
答案 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的描述。