NSUserDefaults erst nach zweitem Aufruf der App vorhanden

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

  • NSUserDefaults erst nach zweitem Aufruf der App vorhanden

    Hey zusammen,

    kann mir einer sagen warum meine NSUserDefaults erst beim 2. Aufruf der App vorhanden sind?

    Ich setze diese im 1. ViewController in der ViewDidLoad()

    Quellcode

    1. let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    2. defaults.setObject(userFBid_data, forKey: "userID")
    3. defaults.setObject(userFBemail_data, forKey: "userEmail")
    4. defaults.synchronize()
    Ist der User bereits über Facebook eingeloggt erfolgt die automatische Weiterleitung zum 2. ViewController, in dem ich dann, ebenfalls in der ViewDidLoad() die Daten abgreifen möchte:


    Quellcode

    1. let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    2. if let _ = defaults.objectForKey("userID") as? String {
    3. print(defaults.objectForKey("userID") as! String)
    4. }
    5. if let _ = defaults.objectForKey("userEmail") as? String {
    6. print(defaults.objectForKey("userEmail") as! String)
    7. }

    Aber es wird nichts angezeigt. Wenn ich die App dann schließe und erneut aufrufe sind die Daten da.


    Nun habe ich es bereits mit einer Repeat / While Schleife versucht aber das hat die App nur zum Absturz gebracht :rolleyes:

    Weiß jemand was hier schief läuft?

    Danke euch :D
  • Zur Frage:
    Nein, da hilft nur der Debugger.

    Aber wenn ich sowas sehe, läuft es mir als alter Programmierer kalt den Rücken runter:

    DKCode schrieb:

    if let _ = defaults.objectForKey("userID") as? String {
    print(defaults.objectForKey("userID") as! String)
    }
    Nicht nur, dass ich Unterstriche hässlich finde - es macht dem Computer auch absolut überflüssige Arbeit.
    In dem Zusammenhang fällt es natürlich nie auf, aber es ist jedes Mal ein unnötiger Zugriff, und

    C-Quellcode

    1. if let value = defaults.objectForKey("userID") as? String {
    2. print(value)
    3. }
    ist in jeder Hinsicht besser.

    Update: Doch noch was zur möglichen Ursache:
    Sicher, dass der zweite Controller nicht schon vorher geladen wird?
  • t-no schrieb:

    Zur Frage:
    Nein, da hilft nur der Debugger.

    Aber wenn ich sowas sehe, läuft es mir als alter Programmierer kalt den Rücken runter:

    DKCode schrieb:

    if let _ = defaults.objectForKey("userID") as? String {
    print(defaults.objectForKey("userID") as! String)
    }
    Nicht nur, dass ich Unterstriche hässlich finde - es macht dem Computer auch absolut überflüssige Arbeit.In dem Zusammenhang fällt es natürlich nie auf, aber es ist jedes Mal ein unnötiger Zugriff, und

    C-Quellcode

    1. if let value = defaults.objectForKey("userID") as? String {
    2. print(value)
    3. }
    ist in jeder Hinsicht besser.

    Update: Doch noch was zur möglichen Ursache:
    Sicher, dass der zweite Controller nicht schon vorher geladen wird?
    ja das ist ja nicht die finale Variante, daher auch das print. Der Unterstrich gefällt mir auch nicht, aber xCode wirft seit dem letzten Update ein Ausrufezeichen und schlägt diese Variante als Verbesserung vor. Daher wird es wohl die bessere Variante sein, wenn von Apple so vorgeschlagen. Warum auch immer ich bin noch nicht dahinter gestiegen. Ist sowieso extrem nervig, das nach jedem Update wieder mindestens 30 "Errors" Dank Codeänderungen korrigiert werden müssen. Aber so ist das wohl leider, wenn man neue Scriptsprachen benutzt.

    Zum Thema zurück der Controller wird eigentlich noch nicht geladen. Start ist der NavigationController1 weiter in den ViewController1, Prüfung ob eingeloggt, wenn ja, weiter zum NavigationController2 rüber zum ViewController2.

    Ich bin leider noch kein Profi was die Hintergrundabläufe in xCode angeht, aber nach meinem Verständnis müsste ja alles nacheinander geladen werden. Kann es sein das die AppDelegate bereits alles am Anfang einmal im Hintergrund startet?
  • 1. Der Unterstrich wird vorgeschlagen, da du die Variable im if let nicht genutzt hast. Mit dem Unterstrich wird der Wert direkt verworfen und keine neue Variable angelegt.

    2. Zu deinem Problem. Soweit ich mich erinnere werden die User Defaults nicht sofort synchronisiert wenn du einen Wert änderst/hinzufügst. Um das zu erzwingen gibt es die Methode synchronize() o.ä. kannst du in der Doku nachlesen. Du kannst also entweder die Werte an deinen 2. VC übergeben oder eben mit synchronize das schreiben erzwingen.
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • pierredrks schrieb:

    1. Der Unterstrich wird vorgeschlagen, da du die Variable im if let nicht genutzt hast. Mit dem Unterstrich wird der Wert direkt verworfen und keine neue Variable angelegt.

    2. Zu deinem Problem. Soweit ich mich erinnere werden die User Defaults nicht sofort synchronisiert wenn du einen Wert änderst/hinzufügst. Um das zu erzwingen gibt es die Methode synchronize() o.ä. kannst du in der Doku nachlesen. Du kannst also entweder die Werte an deinen 2. VC übergeben oder eben mit synchronize das schreiben erzwingen.
    Jab das mit dem Unterstrich hab ich mittlerweile auch rausgefunden. Gar nicht verkehrt. Dennoch Danke für den Tip!

    zu 2. so etwas in der Art hab ich mir schon gedacht allerdings war ich mir nicht ganz sicher.

    in meinem Anfangspost habe ich den Codeabschnitt gepostet, der meine Userdefaults erstellt. In der letzten Zeile nutze ich bereits "defaults.synchronize()"
    daher scheint es hier wohl leider irgendein anderes Problem zu geben. Ich steig echt nicht dahinter warum das nicht will.

    Sollte ich gar nicht dahinter kommen bleibt wohl nur der Weg, die Daten direkt zu übergeben :/
  • pierredrks schrieb:

    2. Zu deinem Problem. Soweit ich mich erinnere werden die User Defaults nicht sofort synchronisiert wenn du einen Wert änderst/hinzufügst.
    Das müssen sie auch nicht, um innerhalb des Programms zur Verfügung zu stehen. Siehe Dokumentation.

    DKCode schrieb:

    zu 2. so etwas in der Art hab ich mir schon gedacht allerdings war ich mir nicht ganz sicher.
    Daran wird es aber nicht liegen. Kannst du das Problem in einem kleinen Beispielprojekte nachstellen und dieses dann hier hochladen?
  • Michael schrieb:

    pierredrks schrieb:

    2. Zu deinem Problem. Soweit ich mich erinnere werden die User Defaults nicht sofort synchronisiert wenn du einen Wert änderst/hinzufügst.
    Das müssen sie auch nicht, um innerhalb des Programms zur Verfügung zu stehen. Siehe Dokumentation.

    DKCode schrieb:

    zu 2. so etwas in der Art hab ich mir schon gedacht allerdings war ich mir nicht ganz sicher.
    Daran wird es aber nicht liegen. Kannst du das Problem in einem kleinen Beispielprojekte nachstellen und dieses dann hier hochladen?
    Ich glaube das mit einem kleinen Beispielprojekt nachzustellen wird nicht funktionieren, da das Hauptprojekt mittlerweile extrem komplex ist und irgendwo
    in dieser Komplexität der Fehler liegt. Ich kann es aber natürlich versuchen. Vielleicht klappt es ja.