Asynchrone Funktionsausführung?

7

In meiner iOS App mache ich folgendes.

%Vor%

Das Problem ist, dass der Spinner nicht erscheint, weil die CPU hart arbeitet (etwas Ähnliches). Es ist so, dass der Code zwischen dem Start und dem Stopp beim Rendern der Ansicht Vorrang hat.

Ich würde gerne einen Weg finden, um den Start des Spinner effektiv zu zeigen, ohne einen Timer zu verwenden, um die Ausführung des Codes zu verzögern.

Danke

    
jollyr0ger 03.06.2011, 09:52
quelle

3 Antworten

22

Wenn Sie eine Methode wie

haben %Vor%

Es gibt mehrere Möglichkeiten, es aus einem anderen Thread aufzurufen. Wählen Sie eine der folgenden Optionen:

%Vor%

Alt + Klick für Details.

    
Jano 03.06.2011, 11:01
quelle
1

Verschieben Sie den Code zwischen Aktivitätsanzeige für Start und Stopp in einen separaten Thread, da er den Hauptthread blockiert. Aus diesem Grund wird der Aktivitätsindikator nicht angezeigt.

Bearbeiten: Beispiel

    
TheBlack 03.06.2011 09:56
quelle
0

Ich stimme der ersten Antwort mit ein paar Änderungen zu. Ich habe genau dasselbe Problem durchgemacht. Das Problem ist, dass alles, was grafisch ist, automatisch in den Hintergrund wechselt, wenn Sie Code haben, der Zeit braucht, um durchzukommen. Den Spinner in den Hintergrund zu werfen ist, was er ohnehin tut. Was Sie wollen, ist (leider) für Sie, dass der Hauptcode im Hintergrund läuft und der Spinner im Vordergrund läuft. Ich weiß, dass sich das schlecht anhört, aber in einigen Fällen lässt der Code etwas langsamer laufen, um anzuzeigen, dass die App etwas Nützliches tut, was für den Benutzer von Vorteil ist.

Um den Spinner zur Arbeit zu bringen:      1) Nimm den ganzen Code, der die 3 Sekunden benötigt, um ihn auszuführen und lege das in eine Funktion, die eine Leerfunktion ist      2) Instanziieren Sie Ihren Spinner, aber speichern Sie ihn in einer Variablen, auf die Sie außerhalb Ihrer viewDidAppear-Routine zugreifen können.      3) Starten eines neuen NSTimer mit diesem läuft kontinuierlich mit einem Inkrement von etwa jeder viertel Sekunde oder so. Ich werde definieren, was in die Routine hineingeht, die später in jedem Zyklus aufgerufen wird.      4) Rufen Sie die in Schritt 1 erstellte Routine mit der Funktion performSelectorInBackground auf. Im Wesentlichen wird jetzt Ihr Startup (3 Sekunden wert) im Hintergrund ausgeführt, was wirklich die einzige Möglichkeit ist, dem animierten Spinner zu erlauben, sich zu zeigen und wirklich zu animieren.      5) Fügen Sie in der Routine, die Sie in Schritt 1 erstellt haben, oben rechts eine Codezeile hinzu, die ein (auf das Objekt globales) Boolean auf "True" aktualisiert und angibt, dass wir mitten in unserer 3-Sekunden-Hauptroutine sind.      6) Am Ende der Routine, die in Schritt 1 definiert wurde, wird eine Codezeile hinzugefügt, die den gleichen globalen Wert wie in Schritt 5 definiert auf "falsch" setzt, um anzuzeigen, dass unsere 3-Sekunden-Routine beendet ist.      7) In der Timer-Routine möchten wir nun etwas tun, das wie folgt aussieht:

%Vor%

Wenn Sie mehr Hilfe zu diesem Thema benötigen, kann ich Ihnen einen genauen Code liefern. Sehen Sie sich die Beispiel-App an, die ich für die Pepperdine News Group entwickelt habe. Wenn Sie eine Taste drücken, wird der Drehknopf oben rechts auf dem Bildschirm angezeigt.

Ссылка

    
trumpetlicks 22.05.2012 15:53
quelle

Tags und Links