Swift IOS Камера зависает и работает в фоновом режиме - PullRequest
0 голосов
/ 01 апреля 2020
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.setUpFunc()
}

override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            self.setUpFunc()
    }

    func setUpFunc() {
           session = AVCaptureSession()
            device = AVCaptureDevice.default(for: .video)

            var error: NSError? = nil
            input = AVCaptureDeviceInput(device: device, error: &error)
            if error == nil {
                session?.addInput(input)
            } else {
                println("camera input error: \(error)")
            }

            prevLayer = AVCaptureVideoPreviewLayer(session: session)
            prevLayer?.videoGravity = .resizeAspectFill

            prevLayer?.connection.videoOrientation = transformOrientation(UIInterfaceOrientation(rawValue: UIApplication.sharedApplication().statusBarOrientation.rawValue)!)

            view.layer.addSublayer(prevLayer)
            stillImageOutput = AVCaptureStillImageOutput()
            let outputSettings = [
                AVVideoCodecKey : AVVideoCodecJPEG
            ]
            stillImageOutput?.outputSettings = outputSettings
            session.addOutput(stillImageOutput!)       
            session?.startRunning()
    }

    func setUpFuncTwo(){
            session.stopRunning()
            sessions = AVCaptureSession()
            device = AVCaptureDevice.default(for: .video)

            var error: NSError? = nil
            input = AVCaptureDeviceInput(device: device, error: &error)
            if error == nil {
                sessions?.addInput(input)
            } else {
                println("camera input error: \(error)")
            }

            prevLayer = AVCaptureVideoPreviewLayer(session: sessions)
            prevLayer?.videoGravity = .resizeAspectFill

            prevLayer?.connection.videoOrientation = transformOrientation(UIInterfaceOrientation(rawValue: UIApplication.sharedApplication().statusBarOrientation.rawValue)!)

            view.layer.addSublayer(prevLayer)
            metadataOutput = AVCaptureMetadataOutput()
            if (sessions.canAddOutput(metadataOutput)) {
                sessions.addOutput(metadataOutput)
                metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)            
            } else {
                return
            }      
            sessions?.startRunning()
            task = DispatchWorkItem { [weak self] in
                   sleep(10)
                if !(self?.task?.isCancelled ?? true) {
                    DispatchQueue.main.async {
                         self!.alert()

                    }
                }
           }
           DispatchQueue.global().async(execute: task)
    }

    @IBAction func button(_ sender: Any) {
    self.setUpFuncTwo()
    }

    func alert() {
    let alert = UIAlertController(title: "Alert", message: "Not scanned! try again", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "ok", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)
    }

        override func viewDidDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            if (session?.isRunning == true) {
                session.stopRunning()
            }
               if (sessions?.isRunning == true) {
                sessions.stopRunning()
               }
        }

После нажатия кнопки setUpFuncTwo () и до появления предупреждения () застревает камера. Иногда setUpFuncTwo () продолжает работать в фоновом режиме даже после перехода на другой контроллер представления. Есть ли лучший способ начать эти два сеанса.

Я запускаю setUpFun c () в viewDidAppear, потому что он будет работать даже после navigationController? .PopViewController из nextviewcontroller, он все еще работает.

запуск setUpFun c () в viewwillAppear, потому что, когда я удаляю этот вызов функции, камера загружается с эффектом слайда.

Помогите мне выйти из строя камеры и работать в фоновом режиме. или я могу использовать серийный Quene? Или я бегу в плохих блоках?

...