Diferir: Dejar una cosa para hacerla más tarde de lo pensado. hemos diferido la reunión hasta el viernes.

Sabiendo esto, ya sabemos que hace defer, dejamos una clousure para que se ejecute después… ¿Después de qué?, después de haber abandonado el scope donde el defer haya sido escrito.

Un ejemplito(playground):


func hola(_ block: () -> Void) {
    defer {
        print("adios")
    }
    print("hola")
    print("before block")
    block()
    print("after block")
}

hola {
    defer { print("defer block") }
    print("inside block")
}

///Imprimirá:
///
///hola
///before block
///inside block
///defer block
///after block
///adios

Ahí tenemos nuestro defer ejecutandose.

Uno de los puntos donde me ha sido útil, aunque parezca una tontería, es aumentando un contador.

Con OHHTTPStubs, podemos devolver un stub u otro en la misma llamada, contando las veces que se ha llamado.

var tokenCallCount = 0
stub(condition: isHost(HOST))) { request in
    if tokenCallCount == 0 {
        return fixture(filePath: path("FirstLoginResponseSuccess"), status: 200, headers: nil)
    } else {
        return fixture(filePath: path("SecondLoginResponseSuccess"), status: 200, headers: nil)
    }
}

Bien… Como ahí veis, no he aumentado el contador aún. En este caso, tenemos un problema, no podemos aumentar el contador al final porque estaría después de un return, entonces no se ejecutaría nunca… Tampoco lo podemos poner al principio, porque haríamos la comparación después de haber sumado una llamada, por lo que en la primera llamada (0), ya tendriamos un 1…

Entonces, ¿podemos ponerlo antes del return dos veces no?

Pues… Si, claramente podemos ponerlo ahí, pero vaya coñazo…

Otra cosa es hacer una variable con la fixtura y segun el contador rellenarla, luego aumentamos el contador y return fixture

Pero, para que tener en cuenta nosotros programando, ¿cuando aumentar la cuenta?, aquí, un caso muy tonto, nos viene de perlas el defer.

Tú, función, cuando acabes de ejecutarte y vayas a abandonar tu scope, aumentame en uno la cuenta…

var tokenCallCount = 0
stub(condition: isHost(HOST))) { request in
    defer { tokenCallCount += 1}
    if tokenCallCount == 0 {
        return fixture(filePath: path("FirstResponse"), status: 200, headers: nil)
    } else {
        return fixture(filePath: path("SecondResponse"), status: 200, headers: nil)
    }
}

Se que el ejemplo no es tan chulo como el de NSHipster (linkeame), donde utilizan Pointer de esos y necesitan llamar a dealloc, que yo no he necesitado usar aún, y las veces que lo he hecho ha sido codigo de stack over flow, para una funcion muy muy concreta…

En fin, que vale para cualquier cosa que queramos hacer “after ejecution” 😌


Y cómo ha quedado cortito, os dejo una canción pa vuestro body 🤓