2009-08-07 15 views
2

Ich versuche einen UIProgressView-Fortschrittsbalken zu aktualisieren, den ich während eines langen Ressourcenladeprozesses in einer UIView habe. Nehmen wir an, ich lade eine Reihe von Bitmaps aus einer NIB-Datei (wie vielleicht hundert). Nachdem ich 10 geladen habe, erstelle ich einen .progress auf das UIProgressView, das Teil einer UIView ist, die bereits angezeigt wird. Also, ich Ausgabe:UIProgressView wird nicht aktualisiert, während meine App ihre Ressourcen lädt

myView.myProgressView.progress=0.2; 

Dann lade ich weitere 10 Bitmaps und Ausgabe:

myView.myProgressView.progress=0.4; 

etc., etc. Wenn die App läuft, wird der Fortschrittsbalken nicht weiter. Es bleibt einfach in seiner ursprünglichen Position. Auf die Gefahr hin, wie ein kompletter Idiot zu klingen, muss ich meine Ressourcen in einen separaten Thread laden, damit das Betriebssystem die Benutzeroberfläche aktualisieren kann, oder gibt es einen einfacheren Weg? Danke für jegliche Hilfe.

Antwort

1

Ja. Laden Sie sie in einem separaten Thread. Oder benutzen Sie einfach so etwas wie performSelector:

[self performSelector:@selector(setProgressBar) withObject:nil afterDelay:0.0]; 

(und erstellen Sie eine setProgressBar Funktion, die den aktuellen Wert von einer Membervariable liest und aktualisiert die UI)

+0

Hallo, Marc, Ich habe versucht, Ihre performSelector Ansatz ohne Erfolg. Die Methode setProgressBar wurde NACH all meinem anderen Code aufgerufen. Ich habe nicht einmal versucht, das UIProgressView zu aktualisieren. Ich legte einfach einen NSLog in setProgressBar und das kam nach allen anderen Ressourcen laden Methoden auf der Konsole heraus. Irgendwelche anderen Vorschläge ? Kannst du mich auf eine Referenz verweisen, um vielleicht all das in einem anderen Thread zu tun? – kspeacock

+1

Hoppla. Die Idee ist also richtig, Sie müssen die Daten in einem Thread aktualisieren und den Hauptthread (UI-Thread) dabei nicht blockieren. Ich denke, dass Sie performSelectorOnMainThread verwenden müssen, wenn Sie diesen Ansatz verwenden (suchen Sie auf der Entwicklerseite nach den Dokumenten zu diesem Thema). – marcc

0

Sie einen Schritt des Runloop laufen konnte nach jedem Update von die Benutzeroberfläche:

SInt32 result; 
do { 
    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE); 
} while(result == kCFRunLoopRunHandledSource); 

Es könnte andere schlechte Folgen haben (zB Benutzer ermöglichen, mit der Benutzeroberfläche ausführen Delegierten-view-Controller wie viewDidAppear zu interagieren, bevor sie ausgeführt werden sollen, usw.) so sehr, v sehr vorsichtig.

Verwandte Themen