2017-03-09 9 views
2

CGDisplayStream을 사용하는 Mac 응용 프로그램의 화면 캡처를 구현하고 있습니다. 질문과 비슷하지만 here과 비슷하지만 Swift에서 질문했습니다. ... 때 일어나고있는 것 같다 무엇대기열과 함께 CGDisplayStream 사용

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") 
} 

큐 프로세스가 제대로 초기화되지 않는 것입니다,하지만 난 모르겠어요 : 아래

내 응용 프로그램의 하나의 ViewController에서 내가 가지고있는 코드입니다 앱이 시작되면 self.update()이 한 번만 호출되지만 한 번만 호출됩니다. 디스플레이 스트림이 제대로 시작되었다는 것을 감안할 때이 함수가 반복적으로 호출 되길 기대하지만 한 번만 호출됩니다.

누구든지 아이디어가 있습니까? 큐를 올바르게 설정하지 않습니까?

감사합니다.

답변

2

문제 displayStream에 대한 참조가 viewDidAppear의 밖에 유지되지 않으므로 스트림은 해당 메소드의 리턴 에 해제 될 것이라는 것이다. 문제 해결해야 한번보기 제어기의 속성을 만들기

: 그것은 (A)의 일부인 경우, 사이클 유지하고보기 제어를 허용 viewWillDisappear 끊어짐 스트림 해제

class ViewController: NSViewController { 

    var displayStream: CGDisplayStream? 

    override func viewDidAppear() { 
     super.viewDidAppear() 

     // ... 

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

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

} 

가 (할당 해제 될 뷰 컨트롤러 계층 구조).

+0

그래, 그게 정확히 문제 였어. 고맙습니다! – narner

+0

잠시 동안 나를 괴롭힌 비슷한 증상을 가진 또 다른 잡아 : 처리기 콜백은 입력 디스플레이가 변경 될 때만 발생합니다. 따라서 나와 같은 사람이라면 대부분의 작업을 외부 모니터에서 수행 할 수 있습니다. 입력 디스플레이로 선택한 디스플레이로 마우스를 움직여야 콜백이 시작됩니다. –