查看控制器需要5-10秒才能显示

use*_*668 1 camera ios avcapturesession segue swift

我正在使用swift 4并有一个应用程序,人们可以通过我的应用程序打开他们的手机相机.我有一个ViewController被调用CameraController,它具有默认值UIView,我在其上面有一个视图,CameraView它显示用户摄像头和其他按钮.

当我点击其中一个按钮时,它会通过segue(PlacesController)将我带到另一个视图控制器.当我解雇时,PlacesController我回到CameraController现在,子视图现在需要大约8或10秒再次显示.

在某些情况下我可以在保持当前子视图的同时转到另一个控制器吗?

问题是,当我进入我的segue控制器PlaceController然后回到我的状态CameraController时,相机和子层变得可见之前需要大约8或10秒.特别是这个代码下面我想知道我是否可以保持我的子层仍然运行,因为它等待10秒显示太多了.

self.CameraView.layer.insertSublayer(previewLayer!, at: 0)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

class CameraController: UIViewController {
    @IBOutlet weak var CameraView: UIView!
     var previewLayer: AVCaptureVideoPreviewLayer?
     let captureSession = AVCaptureSession()


  override func viewDidLoad() {
        super.viewDidLoad()


    }
 override func viewDidAppear(_ animated: Bool) {
           DispatchQueue.main.async {
             self.beginSession()
        }

    func beginSession() {
   // gets the camera showing and displays buttons on top of it
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        self.CameraView.layer.insertSublayer(previewLayer!, at: 0)
        previewLayer?.frame = self.CameraView.layer.bounds

        previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        captureSession.startRunning()
        stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecType.jpeg]
        if captureSession.canAddOutput(stillImageOutput) {
            captureSession.addOutput(stillImageOutput)
        }
    }


  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "PlacesController" {
            let PlaceAreaSearchC: ColorC = segue.destination as! PlacesController
            PlaceAreaSearchC.delegate = self
        }
    }

 // PlacesController
class PlacesController: UIViewController {
    @IBAction func backAction(_ sender: Any) {
   // This is how I go back to my view CameraController
         dismiss(animated: true, completion: nil)
    }
 }
Run Code Online (Sandbox Code Playgroud)

Lyn*_*ott 18

AVCaptureSession startRunning调用阻止了您的主线程因此延迟.

正如它startRunning()的Apple Doc中所述:

startRunning()方法是一个阻塞调用,可能需要一些时间,因此您应该在串行队列上执行会话设置,以便不阻止主队列(这使UI保持响应).


sig*_*sig 7

除了回答Lyndsey斯科特:

    let backCamera: AVCaptureDevice? = AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, position: AVCaptureDevice.Position.back)

    guard let camera = backCamera, let deviceInput = try? AVCaptureDeviceInput(device: camera) else {
        self?.didReceive(captureSession: nil)
        return
    }

    DispatchQueue.global(qos: .userInitiated).async { [weak self] in
        let deviceOutput = AVCapturePhotoOutput()
        let cameraSession = AVCaptureSession()

        cameraSession.beginConfiguration()
        cameraSession.sessionPreset = .low
        if cameraSession.canAddInput(deviceInput) {
            cameraSession.addInput(deviceInput)
        }
        if cameraSession.canAddOutput(deviceOutput) {
            cameraSession.addOutput(deviceOutput)
        }
        cameraSession.commitConfiguration()
        cameraSession.startRunning()
        DispatchQueue.main.async {
            self?.didReceive(captureSession: cameraSession)
        }
    }
Run Code Online (Sandbox Code Playgroud)

Xcode 10.0,Swift 4.2