2016-07-27 169 views
0

我以前(在主线程上同步)绘制图像,效果很好。下面是我画什么:如何使用GCD绘制图像?

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() 
} 

感谢您的帮助! :)

回答

0

您可以将您的绘图代码移动到后台线程。你只需要确保在主线程上更新实际的UI。在StackOverflow上似乎有一些很好的资源可以涵盖这一点。退房: Having UIView drawRect occur in a background thread

+0

是的,你是对的,我已经通过在后台线程中绘制内容解决了这个问题,当绘图操作完成时,我在主线程的UI上显示图像。 –

0

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

+0

我认为CGContext操作在iOS 4.0以上是线程安全的。 –