Frage

Ich lade ein mp3 mit NSData dataWithContentsOfURL: url. Dies dauert eine Weile, und während die Datei, die die Anwendung hängt heruntergeladen. Ich will gut und ideal zu handhaben möchte den Download-Fortschritt zeigen, aber kann diese Methoden nicht für diese finden.

Es ist in einem UIViewController ist, und ich habe einen ersten Versuch gemacht, indem sie in einem UIActivityIndicatorView setzen und starten Sie es Spinnen, bevor ich den Download starten, dann ist es nach dem Spinnen stoppen, aber nichts angezeigt.

Also meine Frage ist wirklich bitte könnte mir jemand sagen, was der beste Weg, dies zu handhaben ist? Vielen Dank

War es hilfreich?

Lösung

Es wird nichts angezeigt, da Ihr Hauptthread blockiert den Download zu tun, und der Haupt-Thread ist, wo UI-Updates auftreten.

Sie sollten verwenden NSURLConnection zum Download der Delegatmethoden zum starten / stoppen Sie Ihre Spinner asynchron und implementieren.

Alternativ, wenn Sie mit NSData des dataWithContentsOfURL:url zu kleben wollen, sollten Sie dies auf einem separaten Thread tun und die Spinner auf dem Haupt-Thread aktualisieren, bevor und nachdem Sie es nennen.

Andere Tipps

Sie können dies erreichen, während noch synchrone Methoden verwenden, aber Sie müssen der Laufschleife eine Chance geben, die Aktivitätsanzeige zu starten Animieren, bevor Sie den Download starten.

Sie können dies erreichen, indem entweder performSelector:withObject:afterDelay: mit Verzögerung 0 mit einer Laufschleife zwischen Animation Start zu setzen und dem Download oder (schlechter Stil, riskanter) können Sie direkt aufrufen, um die Laufschleife innerhalb des Codes.

Beispielcode:

- (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];
}

Weitere Informationen finden Sie hier: http://bynomial.com/blog/?p=15 (Nach unten scrollen zu Lösung 1 oder Lösung 2).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top