2009-06-25 6 views
1

Ich bin ziemlich neu in der iPhone Entwicklung, aber ich bin kurz davor meine erste App zu veröffentlichen (im Zusammenhang mit einer Website die ich betreibe). Die App benötigt eine sehr große Datenbank und als solche habe ich beschlossen, nur die am häufigsten verwendeten Daten lokal zu speichern und die anderen Daten über einen JSON-Webservice-Aufruf aus der Datenbank abzurufen, auf der meine Website läuft.Verwenden von Sleep in iPhone Apps (speziell mit UINavigationController)

Während der OK-Vorgang mit dem Simulator (Live-DB-Suche) dauerte die Suche nach dem Web-Service-Anruf länger als ich mir das gewünscht hätte. Diese Aufrufe sehen im Vergleich zu den sofortigen nativen Suchen viel schlechter aus. Um den relativen Unterschied zu reduzieren, wollte ich ein gefälschtes Interstitial (Seite mit Aktivitätsanzeige) für die nativen Suchanfragen einfügen (die Webdienst-Suche verwendet bereits eins), aber ich hatte ein Problem mit dem Timing von Navigationssteuerungs-Pushs, wenn kombiniert Schlaf (n).

Wie auch immer, der Suchbereich meiner App ist ein navController mit einem tabController Registerkarte. Beim Versuch, Code wie folgt zu verwenden:

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES]; 
sleep(2);

Ich finde, dass der Push wartet immer für den Schlaf vor der Ausführung zu beenden, wenn der Effekt, den ich will, ist für die Viewcontroller geschoben werden und dann zwei Sekunden lang die App warten bevor Sie fortfahren, den Suchprozess zu simulieren.

Ich hatte einige andere seltsame Ergebnisse mit navController Pushs, bei einigen Gelegenheiten habe ich erlebt, was ein Maischen von zwei separaten Viewcontrollern ist, wenn der, den ich als Interstitial geschoben habe inhaltlich mit bleibt nur der Titel desjenigen, den ich möchte, ist an seinem Platz geblieben.

Ich bin mir sicher, dass es einen grundlegenden Mangel an Verständnis auf meiner Seite zu beschuldigen gibt, so hoffe ich auf ein bisschen Anleitung hier.

Prost,

Alan.

Antwort

3

sleep(float) blockiert den Hauptthread, der zum Einfrieren der Benutzeroberfläche führt. Sie sollten stattdessen eine Aktion planen später -[NSObject performSelector:withObject:afterDelay:]

Beispiel für die Verwendung durchgeführt werden:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f]; 
+0

Danke! Das hat perfekt funktioniert. Nachdem ich die Daten aus der nativen Suche zurückgeholt habe, drücke ich den waitController (Interstitial) und verwende dann performSelector mit einer Verzögerung, wenn ich die Methode in appDelegate aufruft, die die Ergebnisse lädt. – alan

0

ich bei Änderung Ihrer Architektur aussehen würde und nicht auf dem Haupt-Thread schlafen - keine große Benutzererfahrung!

Sehen Sie sich die Verwendung von NSOperation an, um Ihre Interaktionen mit dem Webdienst zu steuern. Auf diese Weise können Sie Operationen in eine Warteschlange stellen und sie in einer bestimmten Reihenfolge oder parallel ausführen lassen.

NSOperation ist eine sehr einfache Möglichkeit, stabile Threading-Operationen bereitzustellen - und Sie können wählen, ob Sie mit allen Aktualisierungen, die Sie auf dem Weg durchführen möchten, zum Hauptthread zurückkehren.

Ich denke, dass diese Architektur Ihnen helfen wird, die Benutzeroberfläche viel besser zu machen - aber sobald Sie Ihr Denken neu konfiguriert haben, um Operationen zu verwenden, werden Sie viele andere Vorteile finden.

Hinweis: Ich habe einige Male gebraucht, um mich mit NSOperation und NSOperationQueue vertraut zu machen - aber die Zeit, die ich investiert habe, hat sich definitiv gelohnt.

+0

Danke dafür. Ich werde in NSOperation schauen. Obwohl in diesem Fall meine Handhabung des Web Service Calls nicht das Problem ist. Ich versuche, den Effekt zu reproduzieren, den ich mit dem Web-Service-Aufruf einer Interstitial-Seite bei der nativen Suche erhalte. Prost. – alan

+0

Ich denke immer noch, dass Sie nicht auf dem Hauptthread schlafen sollten und dass dies die Ursache Ihrer Probleme sein könnte - vielleicht verwenden Sie NSOperation, um das Timing der Änderungen in Ihrer Benutzeroberfläche zu verwalten - selbst wenn Ihre Operation nur für 2 Sekunden vor dem Zurücksenden schläft eine Nachricht an deine UI, um das nächste zu tun - ich denke, es wird besser sein, als auf dem Hauptthread zu schlafen. – Grouchal

+0

Definitiv zustimmen, obwohl ich performSelector wie oben vorgeschlagen benutze, was ich nehme, verzögert einfach eine Aktion, anstatt den Thread zu schlafen. (Und ja, NSOperation macht mir Angst;) Prost. – alan

Verwandte Themen