代码之家  ›  专栏  ›  技术社区  ›  user1591668

Segue到控制器需要5-10秒来显示

  •  1
  • user1591668  · 技术社区  · 7 年前

    我正在使用Swift4,并且有一个应用程序,人们可以通过我的应用程序打开他们的手机摄像头。我有一个视图控制器 CameraController 哪个有默认值 UIView 我有一个观点 CameraView 上面显示用户相机和其他按钮。

    当我单击其中一个按钮时,它会通过一个segue将我带到另一个视图控制器。( PlacesController )当我解散 位置控制器 我回到 摄像控制器 然而,子视图现在需要8或10秒才能再次显示。

    我能去别的地方吗 控制器 同时维护我当前的子视图?

    问题是,当我去我的Segue控制器时 PlaceController 然后回到我的 摄像控制器 大约需要8到10秒,摄像头和子层才会显现出来。特别是下面的代码,我想知道是否可以让我的子层继续运行,因为等待10秒让它显示太多了。

    self.CameraView.layer.insertSublayer(previewLayer!, at: 0)
    

    这是我的代码:

    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)
        }
     }
    
    2 回复  |  直到 7 年前
        1
  •  16
  •   Lyndsey Scott    7 年前

    这个 AVCaptureSession startRunning 调用阻塞了您的主线程,从而导致延迟。

    就像上面说的 startRunning() ’s Apple Doc :

    startrunning()方法是一个阻塞调用,可能需要一些时间, 因此,应在串行队列上执行会话设置,以便 主队列没有被阻塞(这使UI保持响应)。

        2
  •  6
  •   sig    7 年前

    除了 answer 属于 斯科特 :

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

    Xcode 10.0,Swift 4.2