Estoy tratando de crear una clase que maneje múltiples descargas al mismo tiempo (necesito descargar una gran cantidad de archivos pequeños) y tengo problemas con las conexiones que "desaparecen".descargas simultáneas de fondo en el iphone
Tengo la función addDonwload que agrega la url a la lista de URL para descargar, y comprueba si hay una ranura de descarga gratuita disponible. Si hay uno, comienza la descarga inmediatamente. Cuando finaliza una de las descargas, elijo la primera lista de formularios de la url y comienzo una nueva descarga.
utilizo NSURLConnection para descargar, aquí hay un código de
- (bool) TryDownload:(downloadInfo*)info
{
int index;
@synchronized(_asyncConnection)
{
index = [_asyncConnection indexOfObject:nullObject];
if(index != NSNotFound)
{
NSLog(@"downloading %@ at index %i", info.url, index);
activeInfo[index] = info;
NSURLRequest *request = [NSURLRequest requestWithURL:info.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
[_asyncConnection replaceObjectAtIndex:index withObject:[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE]];
//[[_asyncConnection objectAtIndex:i] scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
return true;
}
}
return false;
}
- (void)connectionDidFinishLoading:(NSURLConnection*)connection
{
[self performSelectorOnMainThread:@selector(DownloadFinished:) withObject:connection waitUntilDone:false];
}
- (void)DownloadFinished:(id)connection
{
NSInteger index = NSNotFound;
@synchronized(_asyncConnection)
{
index = [_asyncConnection indexOfObject:(NSURLConnection*)connection];
}
[(id)activeInfo[index].delegate performSelectorInBackground:@selector(backgroundDownloadSucceededWithData:) withObject:_data[index]];
[_data[index] release];
[activeInfo[index].delegate release];
@synchronized(_asyncConnection)
{
[[_asyncConnection objectAtIndex:index] release];
[_asyncConnection replaceObjectAtIndex:index withObject:nullObject];
}
@synchronized(downloadQueue)
{
[downloadQueue removeObject:activeInfo[index]];
[self NextDownload];
}
}
- (void)NextDownload
{
NSLog(@"files remaining: %i", downloadQueue.count);
if(downloadQueue.count > 0)
{
if([self TryDownload:[downloadQueue objectAtIndex:0]])
{
[downloadQueue removeObjectAtIndex:0];
}
}
}
_asyncConnection es mi serie de ranuras de descarga (NSURLConnections) downloadQueue está la lista de direcciones URL para descargar
Lo que sucede es, al principio todo funciona bien, pero después de algunas descargas, mis conexiones comienzan a desaparecer. La descarga comienza pero la conexión: didReceiveResponse: nunca se llama. Hay una cosa en la consola de salida que no entiendo que podría ayudar un poco. Normalmente hay algo así como 2010-01-24 21: 44: 17.504 appName [3057: 207] antes de mis mensajes NSLog. Supongo que ese número entre corchetes es algún tipo de aplicación: ¿identificación de hilo? todo funciona bien mientras hay el mismo número, pero después de un tiempo, "NSLog (@" descargando% @ en el índice% i ", info.url, índice);" los mensajes comienzan teniendo diferente ese segundo número. Y cuando eso sucede, dejo de recibir cualquier devolución de llamada para esa conexión url.
Esto me ha estado volviendo loco ya que tengo plazos estrictos y no puedo encontrar el problema. No tengo muchas experiencias con el desarrollo de iphone y aplicaciones multiproceso. He estado probando diferentes enfoques, así que mi código es un poco desordenado, pero espero que veas lo que trato de hacer aquí :)
btw es cualquiera de ustedes que conozca la clase/lib existente que podría usar que sería útil también. Quiero descargas paralelas con la capacidad o dinámicamente añadir nuevos archivos para descargar (por lo que la inicialización de descarga al principio con todas las URL no es útil para mí)
gracias por tus consejos. Reescribí completamente mi clase y funciona como esperaba. Lo siento por la demora, pero olvidé por completo que esto se resolvió hace mucho tiempo :) – Lope