将CGDisplayStream与队列

时间:2017-03-09 12:56:16

标签: swift macos core-graphics grand-central-dispatch

我正在努力实现对CGDisplayStream起诉的Mac应用程序的屏幕截图,类似于问题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()被调用一次,但只有一次。鉴于显示流已正确启动,我希望重复调用此函数,但它只调用一次。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是没有对displayStream的引用保留在外面 viewDidAppear的,因此流将在返回时被释放 那种方法。

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

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中释放流会中断保留周期 并允许视图控制器被释放(如果它是的一部分 视图控制器层次结构)。