NSData
siempre ha tenido un método muy conveniente llamado +dataWithContentsOfURL:options:error:
. Aunque es conveniente, también bloquea la ejecución del hilo actual, lo que significaba que era básicamente inútil para el código de producción (ignorando NSOperation
). Utilicé este método con poca frecuencia, olvidé por completo que existía. Hasta hace poco.NSURLConnection contra NSData + GCD
La forma en que he estado tomando datos de los tubos es el enfoque estándar NSURLConnectionDelegate
: escriba una clase de descarga que maneje los diversos métodos NSURLConnectionDelegate
, construya algunos datos, maneje errores, etc. Normalmente haré este genérico suficiente para ser reutilizado para tantas solicitudes como sea posible.
Digamos que mi clase típica de descarga se ejecuta en algún lugar del estadio de 100 líneas. Eso son 100 líneas para hacer asincrónicamente lo que NSData
puede hacer sincrónicamente en una línea. Para mayor complejidad, esa clase de descarga necesita un protocolo de delegado propio para comunicar terminación y errores a su propietario, y el propietario necesita implementar ese protocolo de alguna manera.
Ahora, introduzca Grand Central Dispatch, y yo puedo hacer algo tan increíblemente simple como:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSData* data = [NSData dataWithContentsOfURL:someURL];
// Process data, also async...
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Back to the main thread for UI updates, etc.
});
});
Y puedo tirar ese lechón en cualquier lugar que quiero, justo en línea. No hay necesidad de una clase de descarga, no es necesario manejar los métodos de delegado de conexión: datos asíncronos fáciles en solo unas pocas líneas. La disparidad entre este enfoque y mi enfoque anterior al GCD es de una magnitud lo suficientemente grande como para activar la alarma de Demasiado Bueno para Ser Verdadero.
Por lo tanto, mi pregunta: ¿Hay alguna advertencia al usar NSData
+ GCD para tareas simples de descarga de datos en lugar de NSURLConnection
(asumiendo que no me preocupan cosas como el progreso de la descarga)?
no puede cancelar la solicitud de uno .. – Daniel