Patrón de diseño: DELEGACIÓN

Patrón de diseño: DELEGACIÓN

El patrón delegación es muy usado en el entorno iOS. Tenemos clases como UICollectionView, UITableView, etc que nos proporcionan delegados para enriquecer el comportamiento de estas clases. En el post de hoy verás un ejemplo del patrón delegación y verás como aplicarlo en tus aplicaciones.

SwiftBeta

El patrón de delegación es otro patrón de comportamiento muy usado en el entorno Apple. Consiste en dar una responsabilidad a otro objeto para que complemente un trabajo.

Un ejemplo, en iOS tenemos UICollectionView para representar de forma visual elementos en forma de grid. Esta clase tiene dos delegates para enriquerezer la UICollectionView. Estos delegados son UICollectionViewDelegate y UICollectionViewDatasource. Si implementamos estos delegados se ejecutan algunas funciones que nos pueden resultar útiles. Como por ejemplo, cuando un user selecciona una celda, o cuando se añade un elemento al grid, etc.

Vamos a ver un ejemplo muy simple. Normalmente la vista recibe las acciones del usuario y delega el trabajo a una clase para que realice algún cálculo, hagua una petición HTTP, etc y luego vuelva a notificar a la vista para indicar que todo ha ido bien.

En este caso vamos a crear dos objetos, simularemos que la UI recibe una interacción del user para guardar su nombre de usuario en su perfil.

Creamos la clase ProfileView con un método que se llamará cuando el user seleccione el botón de guardar. Y creamos una propiedad presenter que se encargará de realizar este trabajo, delegaremos esta responsabilidad a ProfilePresenter.

class ProfileView {
    var presenter: ProfilePresenter?
    
    func addNewUserName() {
        presenter?.saveUser(name: "SwiftBeta")
    }
}

Cuando el presenter acabe de guardar el nombre, llamamos al método didUpdateName() de la variable ui, por si queremos mostrar un banner al usuario o aportar feedback al usuario. Es decir, antes hemos hecho el camino de la UI al presenter, ahora hacemos del presenter a la UI.

class ProfilePresenter {
    weak var ui: ProfileUI?
    
    func saveUser(name: String) {
        print("New \(name) name saved...")
        ui?.didUpdateName()
    }
}

El siguiente paso es crear el protocolo ProfileUI y crear una extension en ProfileView para que lo conforme:

protocol ProfileUI: AnyObject {
    func didUpdateName()
}

extension ProfileView: ProfileUI {
    func didUpdateName() {
        print("Show banner")
    }
}

De esta manera hemos creado el camino en el que:

  • La UI le dice al presenter que guarde el nombre en la base de datos.
  • Cuando el presenter acaba, llama a la ui con el método de didUpdateName() para que la vista muestre un banner o cualquier otro cambio.

Vamos a juntar todas las piezas:

let presenter = ProfilePresenter()
let ui = ProfileView()

ui.presenter = presenter
presenter.ui = ui

// El resultado es:
// "New SwiftBeta name saved..."
// "Show banner"

Primero creamos el presenter y la vista. Luego asignamos sus propiedades respectivamente (este paso es importante ya que si olvidas asignar presenter.ui = ui el camino del presenter a la UI estará roto y en este caso no podrás mostrar el banner al usuario).


Hasta aquí el post de hoy, gracias por leernos! 🤓
Si tienes preguntas no dudes en contactar con nosotros a través de Twitter

Patrones