Daten abspeichern - AppDelegate?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Daten abspeichern - AppDelegate?

    Hallo liebe Mitglieder,

    ich habe eine allgemeine Frage zur Vorgehensweise bei der Programmierung. Ich habe ein kleines Helferchen programmiert, welches zwischen verschiedenen Views und deren Controller im Storyboard wechselt. Zu Beginn ist eigentlich nur ein Begrüßungsbildschirm, anschließend muss man Spielerdaten eingeben und das Spiel wird nach der erfolgreichen Angabe gestartet (Eigene Klasse Game, die dann mit Segues immer weiter gegeben wird).

    So nun möchte ich dem Benutzer die Möglichkeit geben, das Spiel in den Hintergrund legen zu können. Bei klick auf den Home-Button soll die App einfach nur mit dem aktuellen View im Hintergrund sein und bei erneutem Aufrufen wieder an der selben Stelle fortfahren.

    Wie wird das realisiert. Die App macht das zwar jetzt schon aber ohne dass ich das so programmiert habe. Ich möchte die Daten auch sichern wenn die App komplett beendet wird und dem Benutzer bei Neustart auch eine Möglichkeit bieten das alte Spiel fortzusetzen.

    Wie mache ich das? Ich denke das AppDelegate erledigt diese ganze Sachen. Aber wie speichere ich Daten aus unterschiedlichen View Controllern und lade dann wieder genau das, wenn die App wieder in den Vordergrund kommt?

    Danke schon einmal für eure Hilfe!
  • apfelsaft schrieb:

    Ich kenne und habe das Buch. Leider hat es mir spontan nichts gebracht. Ich habe im Glossar schon nach AppDelegate geschaut und mir entsprechende Kapitel durchgelesen. Da steht aber kaum etwas über die konkrete Umsetzung...


    Das liegt daran, dass Dir vermutlich noch das Wissen um MVC und Kommunikation zwischen den Objekten einer App fehlt und nicht daran, dass das Buch es nicht erklärt. Die einzelnen Puzzlestücke sind alle im Buch enthalten. Nur musst Du erstmal die Zusammenhänge verstehen, um das Puzzle zusammensetzen zu können.

    Gottchen, was für ein altkluges Gewäsch. :S

    Überlege mal, welches Objekt welche Daten hält. Und wenn Du das rausgefunden hast, überlegst Du, wie Du diese Daten über das Appdelegate halten und persistieren kannst. Letzteres ist in der Tat schon mal ein richtiger Baustein, da dort das entsprechende Event für den Wechsel des Appzustands aufschlägt.

    Tipp: Core Data könnte Dein Freund sein.
  • Wenn Dein Datenmodell in allen ViewControllern zur Verfügung steht, dann benötigst Du eigentlich nur nur noch eine Referenz darauf im AppDelegate. Dort kannst Du es dann einfach speichern, wenn die App in den Hintergrund gelegt wird.

    Beim Start der App kannst Du dann prüfen, ob ein "aktives" Spiel gespeichert ist. In diesem Fall könntest Du dann den Anwender fragen, ob er dieses Spiel ggf. fortsetzen möchte oder nicht.
  • apfelsaft schrieb:

    Im Moment gebe ich mein Model ja stets an einen ViewController mit einem Segue weiter.

    Da spricht auch nichts dagegen.

    apfelsaft schrieb:

    Ist es besser, immer im AppDelegate zu sichern.

    Nein, immer im AppDelegate sichern ist nicht besser. Wenn eine App in den Hintergrund geht oder beendet wird, wird nicht nur das AppDelegate informiert, sondern es wird auch eine entsprechende Notification verschickt. Jedes Objekt, welches an der Notification interessiert ist, kann sich dafür beim NotificationCenter registrieren.

    Michael
  • MCDan schrieb:

    Wenn Dein Datenmodell in allen ViewControllern zur Verfügung steht, dann benötigst Du eigentlich nur nur noch eine Referenz darauf im AppDelegate. Dort kannst Du es dann einfach speichern, wenn die App in den Hintergrund gelegt wird.

    Beim Start der App kannst Du dann prüfen, ob ein "aktives" Spiel gespeichert ist. In diesem Fall könntest Du dann den Anwender fragen, ob er dieses Spiel ggf. fortsetzen möchte oder nicht.



    Dann scheine ich ja schon auf dem richtigen Weg zu sein. Wie mache ich jetzt eine solche Referenz und wie sichere ich meine eigenen Objekte? Ich kenne bisher nur die variante mit einem Array saveInData oder sowas. Mit CoreData habe ich mich noch nicht beschäftigt. Das Projekt ist aber auch relativ klein sodass ich nicht glaube, dass dies unbedingt notwendig ist.

    Kann jemand ein bisschen Beispielcode schreiben?
  • apfelsaft schrieb:


    Kann jemand ein bisschen Beispielcode schreiben?


    Ja. Du. Jetzt hast Du aber wirklich alles beisammen. Entweder speicherst Du die Daten direkt in den betreffenden Objekten, in dem diese auf die entsprechende Notification lauschen. Oder Du arbeitest mit Referenzen auf die Daten und fackelst alles über das Appdelegate ab.
  • So jetzt habe ich einen Teil hinbekommen:

    Quellcode

    1. [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(enteredBackground) name: @"didEnterBackground" object: nil];
    2. [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(willTerminate) name: @"willTerminate" object: nil];


    Das habe ich in ViewDidLoad eines meiner ViewController rein gepackt.

    Und in der AppDelegate Folgendes:

    Quellcode

    1. - (void)applicationWillTerminate:(UIApplication *)application
    2. {
    3. [[NSNotificationCenter defaultCenter] postNotificationName: @"willTerminate" object: nil userInfo: nil];
    4. }
    5. - (void)applicationDidEnterBackground:(UIApplication *)application
    6. {
    7. [[NSNotificationCenter defaultCenter] postNotificationName: @"didEnterBackground" object: nil userInfo: nil];
    8. }
    9. }


    Dann habe ich im ViewController die beiden Methoden enteredBackground und willTerminate hinzugefügt. Beide machen im Moment nichts anderes als einfach einen NSLog auszugeben. Das klappt mit enteredBackground super aber bei willTerminate wechselt die Ansicht am Mac immer vom iOS Simulator zurück zu XCode und zeigt den Fehler (lldv) an...

    Was mache ich noch falsch? Hab ich irgendwie was mim Speicher falsch gemacht? Da steht ja was mit NSReleasePool... ARC ist an!

    [IMG:https://dl.dropboxusercontent.com/u/2837648/XCodeFehlerWillTerminate.png]

    Danke schon mal!