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

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top