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

时间:2019-07-10 08:48:25

标签: swift xcode grand-central-dispatch

我有一个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线程检查器。我不想在方案设置中将其关闭,但希望让线程检查器忽略此语法。

有人知道如何实现吗?

谢谢

1 个答案:

答案 0 :(得分:1)

问题是您正在从后台线程访问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
    }
}
相关问题