Awalz / SwiftyCam

A Snapchat Inspired iOS Camera Framework written in Swift
BSD 2-Clause "Simplified" License
2.08k stars 326 forks source link

UIView.layer must be used from main thread only #177

Closed Cez95 closed 5 years ago

Cez95 commented 6 years ago

A memory leak is caused in the PreviewLayer file here: var videoPreviewLayer: AVCaptureVideoPreviewLayer { let previewlayer = layer as! AVCaptureVideoPreviewLayer switch gravity { case .resize: previewlayer.videoGravity = AVLayerVideoGravity.resize case .resizeAspect: previewlayer.videoGravity = AVLayerVideoGravity.resizeAspect case .resizeAspectFill: previewlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill } return previewlayer }

Here is the console output: Main Thread Checker: UI API called on a background thread: -[UIView layer] PID: 8632, TID: 2107163, Thread name: (none), Queue name: session queue, QoS: 0 Backtrace: 4 SwiftyCam 0x0000000102a3ea54 _T09SwiftyCam11PreviewViewC05videoC5LayerSo014AVCaptureVideocF0Cvg + 56 5 SwiftyCam 0x0000000102a4e6d4 _T09SwiftyCam0aB14ViewControllerC19getVideoOrientation06_CC0C9I25E867B3760B903CEB3F5BFDE16LLSC09AVCapturefG0OyF + 384 6 SwiftyCam 0x0000000102a4ab2c T09SwiftyCam0aB14ViewControllerC19startVideoRecordingyyFyycfU + 1124 7 SwiftyCam 0x0000000102a47a5c _T0Ieg_IeyB_TR + 52 8 libdispatch.dylib 0x0000000103f691dc _dispatch_call_block_and_release + 24 9 libdispatch.dylib 0x0000000103f6919c _dispatch_client_callout + 16 10 libdispatch.dylib 0x0000000103f77dfc _dispatch_queue_serial_drain + 768 11 libdispatch.dylib 0x0000000103f6c6ac _dispatch_queue_invoke + 328 12 libdispatch.dylib 0x0000000103f78d54 _dispatch_root_queue_drain_deferred_wlh + 352 13 libdispatch.dylib 0x0000000103f7fe38 _dispatch_workloop_worker_thread + 676 14 libsystem_pthread.dylib 0x0000000182fffe70 _pthread_wqthread + 860 15 libsystem_pthread.dylib 0x0000000182fffb08 start_wqthread + 4 2018-09-06 10:46:29.818118-0400 Writeboard[8632:2107163] [reports] Main Thread Checker: UI API called on a background thread: -[UIView layer] PID: 8632, TID: 2107163, Thread name: (none), Queue name: session queue, QoS: 0 Backtrace: 4 SwiftyCam 0x0000000102a3ea54 _T09SwiftyCam11PreviewViewC05videoC5LayerSo014AVCaptureVideocF0Cvg + 56 5 SwiftyCam 0x0000000102a4e6d4 _T09SwiftyCam0aB14ViewControllerC19getVideoOrientation06_CC0C9I25E867B3760B903CEB3F5BFDE16LLSC09AVCapturefG0OyF + 384 6 SwiftyCam 0x0000000102a4ab2c T09SwiftyCam0aB14ViewControllerC19startVideoRecordingyyFyycfU + 1124 7 SwiftyCam 0x0000000102a47a5c _T0Ieg_IeyB_TR + 52 8 libdispatch.dylib 0x0000000103f691dc _dispatch_call_block_and_release + 24 9 libdispatch.dylib 0x0000000103f6919c _dispatch_client_callout + 16 10 libdispatch.dylib 0x0000000103f77dfc _dispatch_queue_serial_drain + 768 11 libdispatch.dylib 0x0000000103f6c6ac _dispatch_queue_invoke + 328 12 libdispatch.dylib 0x0000000103f78d54 _dispatch_root_queue_drain_deferred_wlh + 352 13 libdispatch.dylib 0x0000000103f7fe38 _dispatch_workloop_worker_thread + 676 14 libsystem_pthread.dylib 0x0000000182fffe70 _pthread_wqthread + 860 15 libsystem_pthread.dylib 0x0000000182fffb08 start_wqthread + 4

Cez95 commented 6 years ago

Code that solves the leak: var videoPreviewLayer: AVCaptureVideoPreviewLayer { var previewlayer: AVCaptureVideoPreviewLayer!

    if Thread.current.isMainThread {
        previewlayer =  self.layer as! AVCaptureVideoPreviewLayer
    } else {
        DispatchQueue.main.sync {
            previewlayer =  self.layer as! AVCaptureVideoPreviewLayer
        }
    }

    switch gravity {
    case .resize:
        previewlayer.videoGravity = AVLayerVideoGravity.resize
    case .resizeAspect:
        previewlayer.videoGravity = AVLayerVideoGravity.resizeAspect
    case .resizeAspectFill:
        previewlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    }
    return previewlayer
}
jonandersen commented 5 years ago

@Cez95 which version of the pod was this happening for? If you use the latest do you still see this error?