Cierres rápidos y tareas asincrónicas

Imagine una situación, cuando desee cargar de forma asincrónica algún text del server y mostrar el resultado en UITextField ViewController's .

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { //... some long running async operation if let textResponse = responseFromServer { dispatch_async(dispatch_get_main_queue(), { [weak self] () in self?.textField.text = textResponse }) } }) 

A.) ¿Debo usar [auto débil] dentro del cierre utilizado para llamadas asincrónicas?

Pensé que tenía que hacerlo, pero no estoy seguro después de leer un Q / A aquí en StackOverflow y pasé por unas cuantas aplicaciones de código abierto que no usan [sí mismo débil] para tareas asincrónicas + cierres.

es decir:

El único momento en el que realmente quieres usar [self no own] o [self self] es cuando creas un fuerte ciclo de reference. ( ¿Siempre usamos [el ser no propietario] dentro del cierre en Swift )

No hay un ciclo de reference fuerte en mi caso.

o:

Pero para que quede claro, sería mejor utilizar una reference sólida en esta circunstancia. ( Swift ARC y bloques )

B.) Digamos que es bueno ir con la reference fuerte. ¿Qué le sucede al ViewController cuando el usuario navega a la página diferente en medio de la carga asíncrona? ¿Mantendría el ViewController invisible en la memory de la aplicación hasta que la tarea asíncrona termine?

No hay un ciclo de reference fuerte (retener ciclo) aquí. Si emplea una fuerte reference a self , se resuelve tan pronto como se ejecute el bloque de envío. Teóricamente, podría utilizar una fuerte reference aquí si fuera necesario.

Dicho esto, aconsejaría usar una reference débil en este caso. No tiene sentido mantener una reference sólida durante el process que consume time únicamente con el propósito de actualizar un campo de text para una vista que ya ha sido descartada. Si estuviera actualizando otros objects del model o similares, tal vez necesite mantener una reference sólida, pero no necesita hacerlo en este caso. Como principio general, se debe liberar memory tan pronto como sea razonablemente posible.

Aún mejor, también veré la "operación de synchronization de larga duración" y decidiré si realmente quiero que siga ejecutándose después de que el controller de vista haya sido descartado. Si no, me inclino a hacer que la request sea cancelable y luego cancelar la request. Y, en ese caso, definitivamente querrías usar una reference débil (o deinit no se llamaría hasta que la operación deinit larga duración termine).