如何使用GCD绘制图像?

时间:2016-07-27 03:49:19

标签: ios swift cgcontext dispatch

我之前绘制过一张图片(在主线程上,同步),效果很好。以下是我画的内容:

The final image

但是现在,我想利用GCD重新绘制它以提高性能。但是在我将代码转换为使用GCD后,我得到了如下图像:

image with problem

为什么灰色圆圈会横向移动?

这是最新的代码(异步):

let queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
print("frame: \(self.frame)")
self.attachSunMoon()
self.attachClock(rect)

dispatch_async(queue3, {
   self.buildCircle(circleRadius: self.radius)
})

之前,代码是(同步,这很好,但不是我想要的,我更喜欢使用GCD):

print("frame: \(self.frame)")
self.attachSunMoon()
self.attachClock(rect)
self.buildCircle(circleRadius: self.radius)

最后,buildCircle功能:

    /// Draw the big circle
private func buildCircle(circleRadius radius: CGFloat) {

    UIGraphicsPushContext(self.ccontext!)
    defer { UIGraphicsPopContext() }


    print("frame: \(self.frame)")
    // Drawing code
    let center = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    self.centerPoint = center
    //let radius = max(rect.width, rect.height) - 40
    let startAngle: CGFloat = 0
    let endAngle: CGFloat = 2*π

    let path = UIBezierPath(arcCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
    path.lineWidth = self.arcWidth
    clockBorderColor.setStroke()
    path.stroke()
}

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:0)

您必须在主线程上执行所有UI操作。

答案 1 :(得分:0)

您可以将绘图代码移动到后台线程。您只需要确保在主线程上更新实际UI。 StackOverflow上似乎有一些很好的资源可以解决这个问题。查看: Having UIView drawRect occur in a background thread