¿Cómo hacer una barra de progreso para una NSURLConnection al descargar un archivo?

Quiero mostrar una barra de progreso mientras se realiza una descarga con NSURLConnection. Como estoy recibiendo datos del servidor, podría actualizar la interfaz de usuario para cada paquete recibido. Pero el problema es: ¿cómo averiguo cuántos datos ya tengo y cuántos datos hay que descargar? Probablemente en bytes … ¿Y luego tengo que hacer algunas matemáticas para obtener el porcentaje?

En su delegado de NSURLConnection , implemente algo así para conocer la longitud total del contenido. El servidor tiene que admitir esto, pero lo más probable es que funcione bien con contenido estático:

 - (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURLResponse*) response { statusCode_ = [response statusCode]; if (statusCode_ == 200) { download_.size = [response expectedContentLength]; } } 

Y luego actualiza el progreso de esta manera:

 - (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data { [data_ appendData: data]; download_.progress = ((float) [data_ length] / (float) download_.size); // Broadcast a notification with the progress change, or call a delegate } 

En mi caso, tengo una instancia de descarga que tiene propiedades de size y progress . Son propiedad de un objeto global DownloadManager que se encargará de notificar a las partes interesadas sobre el progreso de la descarga o los cambios de estado.