Как реализовать «Бесконечную задачу» в Swift - PullRequest
0 голосов
/ 24 апреля 2019

Я новичок в Свифте, и у меня нет особого опыта. И дело в том, что у меня возникает проблема высокой загрузки ЦП (более 100% использования процессора в сеансе отладки Xcode), когда я добавляю следующие коды.

Для реализации бесконечного рабочего потока я использовал GCD (наиболее рекомендуемый способ во многих статьях), включая структуру while-loop.

private let engineQueue = DispatchQueue(label: "engine queue", qos: .userInitiated)

public func startEngine() {
        engineQueue.async {
            while true {
                if (self.captureManager.isSessionRunning) {
                    guard let frame = self.captureManager.frameQueue.popFrame(),
                        let buf = frame.getYPlanar() else {
                            continue
                    }

                    // process a frame
                    self.engine.processNewFrame(buf: buf, width: Int32(frame.cols!), height: Int32(frame.rows!))
                }
            }
        }
    }

И я заметил, что это ужасная практика (высокая загрузка ЦП), и должен быть способ лучше, чем этот.

Так что вопросы

  1. Должен ли я использовать GCD вместо Thread в этом случае?

  2. Как лучше для этого работать?

Спасибо

...