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? Или я бегу в плохих блоках?