Estoy trabajando en un proyecto rápido y tengo una pregunta para refactorizar mi código.
Estoy escribiendo un código para verificar si un usuario autorizó la autorización de la cámara y el micrófono en la aplicación. Escribí los siguientes códigos, pero supongo (y espero) que puedo refactorizar el código porque creo que el siguiente código no está claro. Entendí la gramática básica de Swift y gradualmente entendí el lenguaje compilado, pero avíseme si hay alguna manera de hacer que esto sea más legible o fácil de escribir.
Lo que quiero hacer aquí es...
compruebe si tanto una cámara como un micrófono están autorizados.
si ambos están autorizados, muestre View Controller con showNextVC().
si ninguno de los elementos está autorizado, mostrar una alerta con showConfigurationAlert
func checkAuthStatus(){ checkCameraStatus() } func checkCameraStatus() { switch AVCaptureDevice.authorizationStatus(for: .video) { case .notDetermined: print("not Determined") AVCaptureDevice.requestAccess(for: .video) { granted in if granted { print("Now it's granted") } } case .restricted: print("restricted") showConfigurationAlert(for: "camera") case .denied: print("denied") showConfigurationAlert(for: "camera") case .authorized: checkMicrophoneStatus() @unknown default: print("unknown") } } func checkMicrophoneStatus() { switch AVCaptureDevice.authorizationStatus(for: .audio){ case .notDetermined: AVCaptureDevice.requestAccess(for: .audio) { granted in if granted { print("Now it's granted") } } case .restricted: print("restricted") showConfigurationAlert(for: "microphone") case .denied: print("denied") showConfigurationAlert(for: "microphone") case .authorized: print(("authorized")) showNextVC() @unknown default: print("unknown") } }Lo que hice fue verificar primero la autorización de la cámara en checkAuthStatus y luego, si la cámara está autorizada, activar checkMicrophoneStatus() para verificar la autorización del micrófono. La razón por la que creo que este código no está claro es que solo escribo una función para verificar la autorización de la cámara en la función checkAuthStatus(). Creo que si está claro si puedo escribir algo como
func checkAuthStatus(){ // check both cameara and microphone is authorized. // if both of them are authorized, show next VC with showNextVC() function. }Puede cambiar checkCameraStatus() y checkMicrophoneStatus() para devolver un bool y dentro de checkAuthStatus() cambiar a:
func checkAuthStatus(){ let cameraAuthorised = checkCameraStatus() let micAuthorised = checkMicrophoneStatus() if (cameraAuthorised && micAuthorised) { showNextVC() } }Una forma es agregar un parámetro de cierre onAuthorised a ambas funciones. Las dos funciones checkXXXStatus también tienen mucho en común. No necesitamos duplicar la instrucción switch.
func checkMediaStatus(type: AVMediaType, deviceName: String, onAuthorised: (() -> Void)?) { switch AVCaptureDevice.authorizationStatus(for: type){ case .notDetermined: AVCaptureDevice.requestAccess(for: type) { granted in if granted { print("Now it's granted") } } case .restricted: print("restricted") showConfigurationAlert(for: deviceName) case .denied: print("denied") showConfigurationAlert(for: deviceName) case .authorized: print(("authorized")) onAuthorised?() @unknown default: print("unknown") } } func checkMicrophoneStatus(onAuthorised: (() -> Void)?) { checkMediaStatus(type: .audio, deviceName: "microphone", onAuthorised: onAuthorised) } func checkCameraStatus(onAuthorised: (() -> Void)?) { checkMediaStatus(type: .video, deviceName: "camera", onAuthorised: onAuthorised) } Entonces checkAuthStatus se puede escribir como:
func checkAuthStatus(){ checkCameraStatus { self.checkMicrophoneStatus { self.showNextVC() } } } También tenga en cuenta que es posible que desee llamar a onAuthorised y showConfigurationAlert en el controlador de finalización de requestAccess . Creo que este es un mejor diseño.
if granted { print("Now it's granted") onAuthorised?() } else { showConfigurationAlert(for: deviceName) }Creo que estás buscando algo como esto:
let videoStatus = AVCaptureDevice.authorizationStatus(for: .video) let audioStatus = AVCaptureDevice.authorizationStatus(for: .audio) switch (videoStatus, audioStatus) { case (.authorized, .authorized): showNextVC() case (.authorized, _): showConfigurationAlert(for: "microphone") case (_, .authorized): showConfigurationAlert(for: "camera") default: print(videoStatus, audioStatus) }Puede verificar ambos casos al mismo tiempo y manejar cada uno de ellos como desee.