将 CGDisplayStream 与队列一起使用

Using CGDisplayStream with a Queue

我正在努力实施 Mac 应用程序的屏幕捕获,起诉 CGDisplayStream,类似于 here 提出的问题,但在 Swift.

下面是我的应用程序单曲中的代码 ViewController:

override func viewDidAppear() {

    super.viewDidAppear()

    let backgroundQueue = DispatchQueue(label: "com.app.queue",
                                        qos: .background,
                                        target: nil)


    let displayStream  = CGDisplayStream(dispatchQueueDisplay: 0, outputWidth: 100, outputHeight: 100,pixelFormat: Int32(k32BGRAPixelFormat), properties: nil, queue: backgroundQueue) { (status, code, iosurface, update) in

        switch(status){
        case .frameBlank:
            print("FrameBlank")
            break;
        case .frameIdle:
            print("FrameIdle")
            break;
        case .frameComplete:
            print("FrameComplete")
            break;
        case .stopped:
            print("Stopped")
            break;
        }

        self.update()

    }

    displayStream?.start()

}


func update(){
    print("WORKING")
}

似乎正在发生的事情是队列进程未正确初始化,但我不确定...当应用程序启动时,self.update() 被调用一次,但仅调用一次。假设显示流已经正常启动,我希望这个函数被重复调用,但它只调用了一次。

有人有什么想法吗?我没有正确设置队列吗?

谢谢!

问题是没有引用 displayStream 被保存在外面 viewDidAppear,因此流将在 return 被释放 那种方法。

使其成为视图控制器的 属性 应该可以解决问题:

class ViewController: NSViewController {

    var displayStream: CGDisplayStream?

    override func viewDidAppear() {
        super.viewDidAppear()

        // ...

        displayStream = CGDisplayStream(...)
        displayStream?.start()
    }

    override func viewWillDisappear() {
        super.viewWillDisappear()
        displayStream?.stop()
        displayStream = nil
    }

}

释放 viewWillDisappear 中的流打破了保留周期 并允许释放视图控制器(如果它是 视图控制器层次结构)。