es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cargador utilizando Protocolo en Swift.

Quiero usar el protocolo para los controladores de vista solo para mostrar y ocultar el cargador. Hasta aquí, he tenido éxito. Pero me gustaría restringir la ejecución de la función del cargador si ya está mostrando el cargador.

Llamo a la función showLoader para las solicitudes de API. Y no quiero ocultar el cargador hasta que todas las solicitudes obtengan una respuesta. ¿Puedo lograr esto si uso la variable del contador como estática? ¿O existe alguna otra forma de lograr esto sin el contador? O incluso si es posible o no, por favor, aconseje.

protocol Loader where Self: UIViewController {
    func showLoader()
    func hideLoader()
}

extension Loader {
    func showLoader() {
        if count == 0 {
            print("Mostrar carga")
        }
        count += 1
    }

    func hideLoader() {
        count -= 1
        if count < 1 {
            count = 0
            print("Ocultar carga")
        }
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución es utilizar una variable booleana para hacer un seguimiento de si el cargador está actualmente mostrándose o no. Puede actualizar esta variable en las funciones showLoader() y hideLoader(), y solo ejecutar el código para mostrar el cargador si aún no se está mostrando. Aquí está una versión actualizada del código:

    protocol Loader where Self: UIViewController {
        func showLoader()
        func hideLoader()
    }
    
    extension Loader {
        private var isLoaderShowing: Bool {
            get {
                return objc_getAssociatedObject(self, &loa derShowingKey) as? Bool ?? false
            }
            set {
                objc_setAssociatedObject(self, &loaderShowingKey, newValue, .OBJC_ASSOCIATION_ASSIGN)
            }
        }
    
        func showLoader() {
            if !isLoaderShowing {
                isLoaderShowing = true
                print("Mostrar cargador")
            }
        }
    
        func hideLoader() {
            isLoaderShowing = false
            print("Ocultar cargador")
        }
    }
    
    private var loaderShowingKey: UInt8 = 0
    

    En este código actualizado, la variable isLoaderShowing se almacena como un objeto asociado de la instancia UIViewController, para que se pueda acceder y actualizar desde cualquier lugar del código. La función showLoader() ahora solo muestra el cargador si isLoaderShowing es falso, y lo establece en verdadero si aún no se está mostrando. La función hideLoader() simplemente establece isLoaderShowing en falso y oculta el cargador.

    Este enfoque evita la necesidad de una variable de contador estática, y garantiza que el cargador solo se muestre una vez a la vez.

Comments are closed.