Как использовать GCD для рисования изображения?

Я нарисовал изображение ранее (в основном потоке, синхронно), оно работает хорошо. Ниже то, что я нарисовал:

Окончательное изображение

Но теперь я хотел бы использовать GCD, чтобы перерисовать его для повышения производительности. Но я получил изображение, как показано ниже, после того, как я включил код для использования 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()
}

Ценю твою помощь! :)


person Rex Tsao    schedule 27.07.2016    source источник


Ответы (2)


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

person D.C.    schedule 27.07.2016
comment
Да, вы правы, я уже исправил эту проблему, рисуя контент в фоновом потоке, и когда операция рисования завершается, я показываю изображение в пользовательском интерфейсе в основном потоке. - person Rex Tsao; 27.07.2016

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

person Gargoyle    schedule 27.07.2016