我正在努力实现对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()
被调用一次,但只有一次。鉴于显示流已正确启动,我希望重复调用此函数,但它只调用一次。
有人有什么想法吗?我没有正确设置队列吗?
谢谢!
答案 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
中释放流会中断保留周期
并允许视图控制器被释放(如果它是的一部分
视图控制器层次结构)。