• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Activity-Inicator beim Laden von Daten

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Hallo,

ich habe eine Table-View. Klickt man dort auf eine Zeile, wird eine neue TableView angezeigt, allerdings lädt diese TableView ihre Daten erst aus dem Internet, das geschieht in der Methode didViewLoad. Das kann natürlich ein bisschen dauern. Dadurch verzögert sich das Darstellen dieser View. Es wäre natürlich gut, wenn eine Activity-Indicator-View angezeigt werden würde, solange die Daten geladen werden. Allerdings weiß ich jetzt nicht wie ich das realisieren kann beim laden einer neuen View.

Gruß

Sascha
 
Registriert
18.01.10
Beiträge
38
Schau dir mal NSURLConnection an. Die läuft asynchron und gibt über das Delegate Updates über den Fortschritt raus. Damit bringst du dann deinen ProgressIndicator auf den neusten Stand.


Gruß
Manfred
 

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Hallo, bei mir läuft sie nicht asynchron. Mein Problem ist, dass ich momentan nicht weiß, wie ich den Activity-Indicator einbauen sollte. Bei mir wird eine TableView angezeigt. Klickt man auf eine Tabelle wird eine andere TableView (TableView2) angezeigt. In der didViewLoad-Methode der TableView2 lade ich die Daten aus dem Internet (der Internetzugriff ist gekapselt in einer extra Klasse). Wenn das länger dauert, dauert es auch bis die View angezeigt wird. Das heißt, es wird die markierte Zeile er ersten TableView angezeigt. Es ist ja schlecht, wenn der Nutzer nicht sieht, dass was geschieht. Was ich jetzt allerdings nicht weiß, wie ich am besten den Progress anzeige, bzw dass überhaupt was passiert. Gruß Sascha
 
Registriert
18.01.10
Beiträge
38
Das kannst du eben nur, wenn du async lädst. Wenn du wartest bis der Request fertig ist hast du keine Change, den Fortschritt anzuzeigen. Das Programm "steht" ja, bis die Daten geladen sind.

Du implementierst die Delegate Methoden von NSURLConnection. Nach start legt die im Hintergrund los. In – connection:didReceiveResponse: bekommst du mit, wann es los geht. In der Response hast du Infos über die Gesamtgröße des files.

Danach bekommst du die Daten häppchenweise in - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data . Damit bekommst du in data die größe des aktuell geladenen Blocks. Alle Daten kannst du dann mit NSMutableData zusammenfügen und hast damit die Anzahl der bereits gelesenen Bytes. Update des Indicators.

Wenn alles geladen ist, bekommst du das in - (void)connectionDidFinishLoading:(NSURLConnection *)connection mit. Jetzt den NSData in das Umwandeln, was du eben brauchst (NSArray oder was da auch immer reingekippt wird) und dann die Anzeige der TV updaten.

Klingt etwas kompliziert, ist es aber nicht. Wenn mans mal gemacht hat, ist das ziemlich einfach.

Generell sollte man auf dem iPhone/Mac asynchron arbeiten. Cocoa ist ein eventgeriebenes Framework. Und synchrone Ladevorgänge stören das iPhone Feeling massiv. Überlass das lieber Javaanwendungen ;)
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
Erstmal solltest du die Daten eh nicht im View selbst laden - denke an MVC!

Ich würde einen Controller zum Daten laden machen und dann asynchronous laden und ein View zwischen die zwei Tables schalten.

Gruss ppocket
 

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Hallo,

kann sein, dass ich da etwas falsch verstanden hab, aber ist ein UITAbleViewController kein Controller? Davon bin ich eigentlich ausgegangen.

Ich habe mir einen Service geschrieben von dem sich der TableViewController die Daten geben lässt und das passiert momentan in der viewDidLoad. Wo dieser Service die Daten herbekommt weiß der TableViewController nicht.

Dieser Service nutzt ein Dao (DataAccessObject) um die Daten zu laden. Wo dieses DAO die Daten her bekommt, weiß der Service auch nicht. Das habe ich so gemacht, um das DAO austauschen zu können, falls sich die Schnittstelle auf die ich zugreife mal ändert.

ein View zwischen die zwei Tables schalten.

Wie meinst du das? Könntest du vielleicht ein kleines Beispiel zeigen?

Gruß

Sascha
 
Registriert
18.01.10
Beiträge
38
Das stimmt schon, mit dem UITableViewController. Genau da gehört das hin.

Mal was Anderes: Willst du wirklich eine Fortschrittsanzeige? Eigentlich gibt es die Network Activity in der Statusbar des iPhone. Die sollte man auch für sowas benutzen. OK, wenn du wirklich downloads hast die ewig dauern, macht ne Fortschrittsanzeige Sinn. Aber die paar Daten für die TV können ja nicht sooooo lange dauern. Solche Standardelemente sollte man verwenden, wegen der Konsistenz.

[[UIApplication sharedApplication] setNetworkindicatorVisible: YES];

Wäre dann dein Freund
 

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Vielleicht ist es oben falsch rübergekommen, aber ich wollte eine Aktivitäts-Anzeige und keine Fortschrittsbalken oder so. :)
Ich hab im Interface-Builder gesehen, dass es einen Activity-Indicator gesehen, der also anzeigt, dass was gemacht wird. Ich wusste allerdings nicht, wie ich diesen verwenden soll, da die View halt erst angezeigt wird, wenn sie die Daten von dem Service bekommen hat.

Solche Standardelemente sollte man verwenden, wegen der Konsistenz.

[[UIApplication sharedApplication] setNetworkindicatorVisible: YES];

Wäre dann dein Freund

Danke dir. Das kannte ich noch nicht.
Aber dazu noch was anderes, falls mal kein Internet zur Verfügung steht, kommt bei anderen Anwendungen immer eine Meldung. Ist die direkt vom IPhone OS, also wird automatisch angezeigt ohne mein zutun oder muss ich die selbst implementieren.

Gruß

Sascha
 

Poljpocket

Salvatico di Campascio
Registriert
07.01.07
Beiträge
432
ich habe eine Table-View. Klickt man dort auf eine Zeile, wird eine neue TableView angezeigt, allerdings lädt diese TableView ihre Daten erst aus dem Internet, das geschieht in der Methode didViewLoad.

Wenn du also doch einen ViewController hast, hab ich nichts gesagt. Es hat nur in deiner Ausführung so getönt :) (siehe Zitat).

Gruss ppocket
 
Registriert
18.01.10
Beiträge
38
Musst du selbst machen:

Code:
if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable)
{
  // alert bringen
}

Dazu musst du das SystemConfiguration Framework linken.
 

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Kann es sein, dass ich die Reachability-Dateien, noch von irgendwo in mein Projekt kopieren muss?

Gruß

Sascha
 
Registriert
18.01.10
Beiträge
38
Oh Mann, wo hab ich nur meinen Kopf...

Natürlich. Ich hab das gerade auf die schnelle aus einem Projekt von mir kopiert.

Hier stammt der Code her. Ich hab den dann für ein Projekt übernommen und etwas modifiziert. Müsste ich mal aufräumen.

Sorry für die Verwirrung.
 

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Kein Problem, hab bei Google zwar gefunden, dass ich es aus dem Beispiel von Apple kopieren muss, aber da du nichts gesagt hattest, dachte ich, dass es eventuell noch ne andere Möglichkeit gibt.

Gruß

Sascha