attuazione UIActivityIndicatorView mentre NSData dataWithContentsOfURL è scaricano
-
25-09-2019 - |
Domanda
sto scaricando un mp3 utilizzando NSData dataWithContentsOfURL: url. Questo richiede un po 'e mentre il file sta scaricando l'applicazione si blocca. Voglio gestire bene e ideale vorrebbe mostrare l'avanzamento del download, ma non riesco a trovare metodi per questo.
E 'in un'UIViewController e ho fatto un primo tentativo, mettendo in un UIActivityIndicatorView e avviarlo a girare prima di iniziare il download, quindi fermarlo girare dopo, ma non appare nulla.
Quindi la mia domanda è in realtà favore, qualcuno potrebbe dirmi che cosa il modo migliore per gestire questa situazione è? Grazie mille
Soluzione
non viene visualizzato perché il thread principale è bloccato a fare il download, e il thread principale è dove si verificano gli aggiornamenti dell'interfaccia utente.
Si dovrebbe usare NSURLConnection per scaricare in modo asincrono e implementare i metodi delegato per accendere / spegnere il vostro filatore.
In alternativa, se si vuole attaccare con NSData
di dataWithContentsOfURL:url
si dovrebbe fare questo su un thread separato e aggiornare il filatore sul thread principale, prima e dopo lo chiami.
Altri suggerimenti
È possibile raggiungere questo obiettivo, pur utilizzando metodi sincroni, ma è necessario dare il ciclo di esecuzione la possibilità di iniziare l'animazione del indicatore di attività prima di iniziare il download.
È possibile raggiungere questo obiettivo utilizzando uno performSelector:withObject:afterDelay:
con un ritardo da 0 a mettere un ciclo corsa tra il vostro inizio l'animazione e il download oppure (stile peggio, più rischioso) è possibile direttamente invocare il ciclo di esecuzione all'interno del codice.
Codice di esempio:
- (void)loadPart1 {
activityIndicator = [[[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIA...StyleGray]
autorelease];
activityIndicator.frame = myFrame;
[self.view addSubview:activityIndicator];
[activityIndicator startAnimating];
[self performSelector:@selector(loadPart2) withObject:nil afterDelay:0];
}
- (void)loadPart2 {
[NSURLConnection sendSynchronousRequest:request returningResponse:&response
error:&error];
[activityIndicator stopAnimating];
}
Maggiori dettagli qui: http://bynomial.com/blog/?p=15 (Scorrere verso il basso per Soluzione 1 o Soluzione 2).