2016-07-27 8 views
0

Я нарисовал изображение ранее (по основной теме, синхронно), он работает хорошо. Ниже то, что я обнаженКак использовать GCD для рисования изображения?

The final image

Но теперь, я хотел бы использовать ГКД, чтобы перерисовать его для повышения производительности. Но я получил изображение, как показано ниже, после я перехожу код, чтобы использовать НОД:

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

Раньше код (синхронно, это хорошо работает, но не то, что я хочу, я предпочитаю использовать НОД) :

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

Вы можете переместить свой код чертежа в фоновый поток. Вам просто нужно обязательно обновить фактический пользовательский интерфейс обратно в основной поток. Кажется, есть несколько хороших ресурсов на StackOverflow, которые покрывают это. Выезд: Having UIView drawRect occur in a background thread

+0

Да, вы правы, я уже исправил эту проблему с помощью содержимого чертежа в фоновом потоке, и когда операция рисования завершена, я покажу изображение в пользовательском интерфейсе в основном потоке. –

0

Вы должны выполнить все операции пользовательского интерфейса на основной теме.

+0

Я думаю, что операции CGContext являются потокобезопасными с iOS 4.0. –

 Смежные вопросы

  • Нет связанных вопросов^_^