2016-07-27 2 views
0

이미지를 이전에 (메인 스레드에서 동기식으로) 그렸으므로 잘 작동합니다. 아래는 내가 그린 것입니다 :GCD를 사용하여 이미지를 그리는 방법?

The final image

하지만 지금, 나는 성능 향상을 위해 그것을 다시 그리기 GCD를 이용하고 싶습니다.

image with problem

은 왜 회색 원이 측방으로 간다 :하지만 내가 GCD를 사용하는 코드를 설정 한 후 다음과 같은 이미지를 가지고?

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

나는 CGOSext 작업이 iOS 4.0에서 스레드 안전하다고 생각합니다. –

관련 문제