将 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
中的流打破了保留周期
并允许释放视图控制器(如果它是
视图控制器层次结构)。
我正在努力实施 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
中的流打破了保留周期
并允许释放视图控制器(如果它是
视图控制器层次结构)。