Benötigt UIActivityIndicator ein manuelles Threading auf dem iPhone?

8

Ich erstelle eine iPhone-Anwendung, die eine kostspielige Operation ausführt, und ich wollte einen activityIndicator erstellen, um den Benutzer wissen zu lassen, dass die Anwendung nicht eingefroren ist.

Die Operation wird vollständig in einem Ereignisaufruf ausgeführt. Es besteht also keine Möglichkeit, dass das UI-Framework die Kontrolle erhält, diesen Indikator tatsächlich anzuzeigen und zu animieren.

Die Beispiel-Apps, die den UIActivityIndicator (oder eine andere ähnliche Animation) verwenden, starten und stoppen die Animation in verschiedenen Ereignissen, die separat in verschiedenen Phasen des Programms ausgelöst werden.

Muss ich manuell einen separaten Thread erstellen, um meine Operation auszuführen, oder gibt es bereits Standardunterstützung für diese Art von Verhalten?

    
Akusete 13.01.2009, 23:37
quelle

5 Antworten

13

Ich habe gerade jemanden gefunden, der eine sehr ähnliche Frage mit einer guten Antwort auf den Apple iPhone Foren stellt. Ссылка #Hinweis: Sie müssen eine AppleID haben, um sie anzuzeigen.

Im Prinzip, ja, Sie müssen Ihren Prozess in einem anderen Thread starten, aber es ist ziemlich einfach zu tun (wie vom Benutzer 'eskimo1' paraphrasiert)

%Vor%

wo -willStartJob und -didStopJobWithStatus meine eigenen Methoden sind:

  • deaktivieren Sie die Benutzeroberfläche, um zu verhindern, dass der Benutzer zwei Aufträge gleichzeitig absetzt
  • Richten Sie den Aktivitätsindikator
  • ein
Akusete 14.01.2009, 00:36
quelle
9

Ja, Sie müssen Ihre Operation in einen separaten Thread einfügen, während die Aufrufe von UIActivityIndicatorView im Hauptthread verbleiben.

Hier ist der Grund: Wenn Sie mit der Animation beginnen, beginnen Sie sofort mit dem Prozess, Ihr Prozess wird bis zum Ende blockiert und der Benutzer wird nie eine Aktivität sehen.

Beginnen Sie stattdessen mit der Animation des Indikators und fügen Sie dann einen neuen Thread für Ihren Prozess ein. Verwenden Sie Benachrichtigungen, ein Delegat-Muster oder performSelectorOnMainThread:withObject:waitUntilDone: , damit der Haupt-Thread weiß, dass der Prozess abgeschlossen ist. Stoppen Sie dann die Animation und fahren Sie fort.

Dies stellt sicher, dass der Benutzer weiß, dass etwas passiert, während Ihr Prozess seine Sache macht.

    
August 14.01.2009 00:35
quelle
4

Das Starten eines neuen Threads kann Overkilling und eine Quelle von Komplexität sein, wenn Sie Dinge tun wollen, die im Hauptthread starten sollen.

In meinem eigenen Code muss ich einen MailComposer durch Drücken einer Taste starten, aber es kann einige Zeit dauern, bis er erscheint und ich möchte sicherstellen, dass sich der UIActivityIndicator währenddessen dreht.

Das mache ich:

%Vor%

Es wird displayComposerSheet in die Warteschlange stellen, anstatt es sofort auszuführen. Genug, damit der Spinner anfängt zu animieren!

    
Xav 06.05.2010 11:45
quelle
-1

Ein UIProgressView (der Fortschrittsbalken) kann nicht von selbst ausgeführt werden, Sie müssen den Wert periodisch erhöhen.

Eine UIActivityIndicatorView (die sich drehende Ausrüstung) kann von selbst ausgeführt werden: Rufen Sie einfach startAnimating auf, wenn Sie Ihre Operation starten, und stopAnimating , wenn Sie fertig sind.

So könnte ein UIActivityIndicatorView das sein, wonach Sie suchen.

    
Stephan Burlot 14.01.2009 00:17
quelle
-1

Was ist einfacher:

%Vor%

oder ....

%Vor%

Ich sehe immer, dass alle A, B, C vorschlagen ... auf die harte Tour.

    
HelenJ 16.09.2010 02:48
quelle