Sto cercando di creare una classe che gestirà più download contemporaneamente (ho bisogno di scaricare molti piccoli file) e ho problemi con le connessioni "in via di estinzione".download di sfondo simultanei su iphone
Ho funzione addDonwload che aggiunge url all'elenco di URL da scaricare e controlla se è disponibile lo slot di download gratuito. Se ce n'è uno, avvia immediatamente il download. Quando termina uno dei download, prendo la prima lista di moduli di url e avvio il nuovo download.
io uso NSURLConnection per il download, qui è un codice
- (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 è la mia serie di slot di download (NSURLConnections) downloadQueue è elenco di URL per scaricare
ciò che accade è, all'inizio tutto funziona bene, ma dopo alcuni download le mie connessioni iniziano a scomparire. Il download inizia ma la connessione: didReceiveResponse: non viene mai chiamato. C'è una cosa nella console di output che non capisco che potrebbe aiutare un po '. Normalmente c'è qualcosa come 2010-01-24 21: 44: 17.504 appName [3057: 207] prima dei miei messaggi NSLog. Immagino che il numero tra parentesi quadre sia una specie di app: ID thread? tutto funziona ok mentre c'è lo stesso numero, ma dopo un po 'di tempo, "NSLog (@" download% @ all'indice% i ", info.url, indice);" i messaggi iniziano ad avere un secondo numero diverso. E quando ciò accade, smetto di ricevere qualsiasi callback per quella connessione url.
Questo mi sta facendo impazzire perché ho delle scadenze rigide e non riesco a trovare un problema. Non ho molte esperienze con iphone dev e applicazioni multithread. Ho provato approcci diversi, quindi il mio codice è piuttosto disordinato, ma spero che vedrete cosa sto cercando di fare qui :)
btw qualcuno di voi sa della classe esistente/lib che potrei usare sarebbe utile anche. Voglio download paralleli con capacità o aggiungere dinamicamente nuovi file da scaricare (quindi inizializzare il downloader con tutti gli URL non è utile per me)
grazie per i tuoi suggerimenti. Ho completamente riscritto la mia lezione e funziona come previsto. Ci scusiamo per il ritardo ma ho completamente dimenticato che questo è stato risolto molto tempo fa :) – Lope