使主线程检查器静音以执行特定操作

Silence Main Thread checker for specific action

我有一个 UICollectionViewCel',这是一个带阴影的嵌入式 UIView,其中有一个 UIImageView。

以下代码根据 imageivew 中的图像获取平均 RGB(感谢 Paul Hudson)

    var averageColor: UIColor? {

    guard let inputImage = CIImage(image: self) else { return nil }
    let extentVector = CIVector(x: inputImage.extent.origin.x, y: inputImage.extent.origin.y, z: inputImage.extent.size.width, w: inputImage.extent.size.height)

    guard let filter = CIFilter(name: "CIAreaAverage", parameters: [kCIInputImageKey: inputImage, kCIInputExtentKey: extentVector]) else { return nil }
    guard let outputImage = filter.outputImage else { return nil }

    var bitmap = [UInt8](repeating: 0, count: 4)
    let context = CIContext(options: [.workingColorSpace: kCFNull])
    context.render(outputImage, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil)

    return UIColor(red: CGFloat(bitmap[0]) / 255, green: CGFloat(bitmap[1]) / 255, blue: CGFloat(bitmap[2]) / 255, alpha: CGFloat(bitmap[3]) / 255)
}

现在这是一段相当昂贵的代码。因此,我的想法是将它弹出到全局队列中,而不是一旦我有颜色来设置主队列上的阴影颜色。

为此,我执行以下操作

      DispatchQueue.global().async {
        if let color = self.cellImageView.image?.averageColor?.cgColor {
            DispatchQueue.main.async {
                self.cardView.layer.shadowColor = color
            }
        }
    }

结果是一个非常流畅的滚动动作,但收入 XCODES 线程检查器。我不想在方案设置中将其关闭,但想让线程检查器忽略此语法。

有人知道如何实现吗?

谢谢

问题是您正在从后台线程访问 属性 UIKit 控件。相反,从主线程的图像视图中获取图像。然后,完成后,您可以在后台线程上计算平均颜色,然后将图层更新分派回主线程:

guard let image = cellImageView.image else { return }

DispatchQueue.global().async {
    guard let color = image.averageColor?.cgColor else { return }

    DispatchQueue.main.async {
        self.cardView.layer.shadowColor = color
    }
}