para - no puedo actualizar mi iphone 4
Conozca el progreso de la descarga para actualizar un UIprogressView (2)
Está utilizando una solicitud sincrónica aquí.
El documento dice: una carga síncrona se construye sobre el código de carga asincrónico disponible por la clase. El hilo de llamada está bloqueado mientras que el sistema de carga asíncrono realiza la carga de URL en un hilo creado específicamente para esta solicitud de carga. No es necesaria ninguna configuración especial de subprocesamiento o bucle de ejecución en la cadena de llamada para realizar una carga síncrona.
Consulte la referencia de clase aquí
Después de leer la referencia de clase, puede enviar una solicitud asincrónica o inicializar la solicitud, establecer un delegado y comenzar.
mi aplicación descarga un video de Internet y lo guarda en el iPhone.
Estoy usando este código
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setHTTPMethod:@"GET"];
NSError *error;
NSURLResponse *response;
NSString *documentFolderPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *videosFolderPath = [documentFolderPath stringByAppendingPathComponent:@"videos"];
//Check if the videos folder already exists, if not, create it!!!
BOOL isDir;
if (([fileManager fileExistsAtPath:videosFolderPath isDirectory:&isDir] && isDir) == FALSE) {
[[NSFileManager defaultManager] createDirectoryAtPath:videosFolderPath withIntermediateDirectories:YES attributes:nil error:nil];
}
NSString *filePath = [videosFolderPath stringByAppendingPathComponent:@"name.mp4"];
if ([fileManager fileExistsAtPath:filePath ] == YES) {
NSLog (@"File exists");
}
else {
NSLog (@"File not found");
NSData *urlData;
NSString *downloadPath = @"http://www.mywebsite.com/name.mp4";
[request setURL:[NSURL URLWithString:downloadPath]];
urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
BOOL written = [urlData writeToFile:filePath atomically:NO];
if (written)
NSLog(@"Saved to file: %@", filePath);
else {NSLog(@"problem");}
}
Todo funciona bien, pero quiero agregar una Vista de progreso para indicar el estado de la descarga.
El problema (creo, pero no estoy seguro) es que mi NSURLConnection no tiene como delegado, por lo que los métodos como
- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
o
-(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{
nunca son llamados.
Intenté usar
urlData = [[NSURLConnection alloc] initWithRequest:request delegate:self];
pero la aplicación falla cuando intento escribir el archivo
[urlData writeToFile:filePath atomically:NO];
¿Que puedo hacer? Gracias
Lo que está haciendo es enviar una solicitud "sincrónica", lo que significa que el hilo que está descargando la respuesta HTTP se bloqueará hasta que se hayan recuperado todos los datos. Nunca es bueno hacer esto en un subproceso de interfaz de usuario, incluso cuando no desea mostrar ningún indicador del progreso de la descarga. Sugiero usar la clase NSURLConnection, establecer su delegado y responder a los métodos de delegado. Puede encontrar un pequeño tutorial para esto en http://snippets.aktagon.com/snippets/350-How-to-make-asynchronous-HTTP-requests-with-NSURLConnection .
Una vez que es delegado de la conexión, puede obtener la longitud del contenido cuando la conexión recibe una respuesta:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
contentSize = [httpResponse expectedContentLength];
}
Luego, para calcular el progreso total de la descarga cada vez que lleguen nuevos datos, haga algo como esto:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// download data is our global NSMutableData object that contains the
// fetched HTTP data.
[downloadData appendData:data];
float progress = (float)[downloadData length] / (float)contentSize;
[progressView setValue:progress];
}
ACTUALIZAR:
Otro ejemplo sobre cómo hacer async HTTP con Foundation: http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/