swift - 将 CGDisplayStream 与队列一起使用

标签 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() 被调用一次,但只有一次。鉴于显示流已正确启动,我希望重复调用此函数,但它只调用一次。

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

谢谢!

最佳答案

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

将其作为 View Controller 的属性应该可以解决问题:

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 中释放流会破坏保留周期 并允许 View Controller 被释放(如果它是 View Controller 层次结构)。

关于swift - 将 CGDisplayStream 与队列一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42695988/

相关文章:

macos - openmpi 忽略错误 : mca interface is not recognized

ios - Core Graphics 上下文,它们是什么?

ios - 如何将 UIScrollView 的转换应用于 UIView?

ios - 带有文本的 SCNMaterial 未出现在带有图像的 SCNMaterial 上

macos - 如何在没有GUI的情况下在后台运行wireshark?

objective-c - 实现后台 worker - Obj C/Cocoa

iphone - 使用 Core Graphics 在 CGContextClip 之后绘制阴影

ios - 当裁剪点位于任何有 4 个点的形状上时,将图像裁剪为矩形形状 - IOS/Swift

swift - Swift-示例-如何在使用AVAudioRecorder录制之前和之后播放提示音?

ios - 从图库中获取图像很慢