Ich arbeite derzeit an einer in Swift entwickelten iOS-App und muss einige vom Benutzer erstellte Inhalte auf dem Gerät speichern, aber ich kann anscheinend keine einfache und schnelle Möglichkeit finden, die Benutzerinhalte auf dem Gerät zu speichern / zu empfangen.
Könnte jemand erklären, wie man lokalen Speicher speichert und darauf zugreift?
Die Idee ist, die Daten zu speichern, wenn der Benutzer eine Aktion ausführt, und sie zu empfangen, wenn die App gestartet wird.
ios
swift
nsuserdefaults
Nicklas Ridewing
quelle
quelle
Antworten:
Die einfachste Lösung, wenn Sie nur zwei Zeichenfolgen speichern, ist
NSUserDefaults
, dass diese Klasse in Swift 3 in just umbenannt wurdeUserDefaults
.Es ist am besten, Ihre Schlüssel irgendwo global zu speichern, damit Sie sie an anderer Stelle in Ihrem Code wiederverwenden können.
Swift 3.0, 4.0 & 5.0
Swift 2.0
Für alles, was schwerwiegender ist als kleinere Konfigurationen, Flags oder Basiszeichenfolgen, sollten Sie einen dauerhaften Speicher verwenden. Eine beliebte Option ist derzeit Realm, aber Sie können auch SQLite oder Apples eigene CoreData verwenden .
quelle
setValue(_:forKey:)
, um Daten in UserDefaults zu speichern. Verwenden Sie die bereitgestelltenUserDefaults
Methoden vonset(_:forKey:)
(in Swift 3).Sie sagen, verwenden Sie NSUserDefaults
Als ich zum ersten Mal eine langfristige Datenspeicherung (nach dem Schließen der App) implementierte, wies mich alles, was ich online las, auf NSUserDefaults hin. Ich wollte jedoch ein Wörterbuch speichern, und obwohl dies möglich war, erwies es sich als schmerzhaft. Ich habe stundenlang versucht, Tippfehler zu beseitigen.
NSUserDefaults ist ebenfalls in seiner Funktion eingeschränkt
Weiteres Lesen zeigte, wie das Lesen / Schreiben von NSUserDefaults die App wirklich zwingt, alles oder nichts auf einmal zu lesen / schreiben, so dass es nicht effizient ist. Dann habe ich gelernt, dass das Abrufen eines Arrays nicht einfach ist. Ich habe festgestellt, dass NSUserDefaults wirklich nicht ideal ist, wenn Sie mehr als ein paar Zeichenfolgen oder Boolesche Werte speichern.
Es ist auch nicht skalierbar. Wenn Sie das Codieren lernen, lernen Sie die skalierbare Methode. Verwenden Sie NSUserDefaults nur zum Speichern einfacher Zeichenfolgen oder Boolescher Werte, die sich auf Einstellungen beziehen. Speichern Sie Arrays und andere Daten mit Core Data. Es ist nicht so schwierig, wie sie sagen. Fangen Sie einfach klein an.
Update: Wenn Sie Apple Watch-Unterstützung hinzufügen, gibt es noch eine weitere mögliche Überlegung. Die NSUserDefaults Ihrer App werden jetzt automatisch an die Watch Extension gesendet.
Verwenden von Kerndaten
Daher ignorierte ich die Warnungen, dass Core Data eine schwierigere Lösung sei, und begann zu lesen. Innerhalb von drei Stunden hatte ich es funktioniert. Ich hatte mein Tabellenarray in Core Data gespeichert und lud die Daten beim Öffnen der App wieder hoch! Der Tutorial-Code war einfach genug anzupassen und ich konnte ihn mit nur ein wenig zusätzlichem Experimentieren sowohl Titel- als auch Detail-Arrays speichern lassen.
Wenn Sie diesen Beitrag lesen und Probleme mit dem Typ NSUserDefault haben oder mehr als nur Zeichenfolgen speichern müssen, sollten Sie ein oder zwei Stunden mit Kerndaten spielen.
Hier ist das Tutorial, das ich gelesen habe:
http://www.raywenderlich.com/85578/first-core-data-app-using-swift
Wenn Sie "Kerndaten" nicht überprüft haben
Wenn Sie beim Erstellen Ihrer App "Kerndaten" nicht aktiviert haben, können Sie sie nachträglich hinzufügen. Dies dauert nur fünf Minuten:
http://craig24.com/2014/12/how-to-add-core-data-to-an-existing-swift-project-in-xcode/
http://blog.zeityer.com/post/119012600864/adding-core-data-to-an-existing-swift-project
Löschen aus Kerndatenlisten
Daten aus Coredata Swift löschen
quelle
Okey also danke an @bploat und den Link zu http://www.codingexplorer.com/nsuserdefaults-a-swift-introduction/
Ich habe festgestellt, dass die Antwort für einige grundlegende Zeichenfolgenspeicher recht einfach ist.
Ich habe es hier zusammengefasst http://ridewing.se/blog/save-local-data-in-swift/
quelle
Die Verwendung von NSCoding und NSKeyedArchiver ist eine weitere großartige Option für Daten, für die zu komplex
NSUserDefaults
ist, für die CoreData jedoch übertrieben wäre. Sie haben auch die Möglichkeit, die Dateistruktur expliziter zu verwalten. Dies ist ideal, wenn Sie die Verschlüsselung verwenden möchten.quelle
Für Swift 4.0 wurde dies einfacher:
quelle
Swift 3.0
Setter: Lokaler Speicher
Getter: Lokale Speicherung
quelle
Für Swift 3
quelle
Für jemanden, der aus bestimmten Gründen nicht lieber mit UserDefaults umgehen möchte, gibt es eine andere Option - NSKeyedArchiver & NSKeyedUnarchiver. Es hilft dabei, Objekte mithilfe des Archivierungsprogramms in einer Datei zu speichern und archivierte Dateien in Originalobjekte zu laden.
Ich habe ein einfaches Dienstprogramm zum Speichern / Laden von Objekten im lokalen Speicher geschrieben, das oben verwendete Beispielcodes verwendet. Vielleicht möchten Sie das sehen. https://github.com/DragonCherry/LocalStorage
quelle
Swift 5+
Keine der Antworten behandelt die im Standard integrierten lokalen Speicherfunktionen wirklich im Detail. Es kann weit mehr als nur Saiten.
Sie haben die folgenden Optionen direkt aus der Apple-Dokumentation, um Daten aus den Standardeinstellungen abzurufen.
Hier sind die Optionen für die Einstellung
Wenn Dinge wie Einstellungen und keine großen Daten gespeichert werden setzen diese sind völlig in Ordnung Optionen.
Doppelbeispiel :
Rahmen:
Bekommen:
Das Interessante an einem der Getter ist dictionaryRepresentation . Dieser praktische Getter verwendet alle Ihre Datentypen, unabhängig davon, um welche es sich handelt, und fügt sie in ein schönes Wörterbuch ein, auf das Sie über den Namen der Zeichenfolge zugreifen können, und gibt den richtigen Datentyp an, wenn Sie danach fragen es zurück, da es vom Typ 'any' ist .
Sie können Ihre eigenen Klassen und Objekte auch mit
func set(Any?, forKey: String)
und speichernfunc object(forKey: String) -> Any?
dementsprechend Setter und Getter.Ich hoffe, dies verdeutlicht die Leistungsfähigkeit der UserDefaults-Klasse zum Speichern lokaler Daten.
In Anbetracht dessen, wie viel Sie speichern sollten und wie oft, gab Hardy_Germany in diesem Beitrag eine gute Antwort darauf . Hier ist ein Zitat daraus
Etwas anderes zu beachten, wie von Benutzer Mohammad Reza Farahani in diesem Beitrag erwähnt, ist die asynchrone und synchrone Natur von userDefaults.
Wenn Sie beispielsweise das Programm speichern und schnell schließen, werden Sie möglicherweise feststellen, dass die Ergebnisse nicht gespeichert werden. Dies liegt daran, dass es asynchron fortbesteht. Möglicherweise bemerken Sie dies nicht immer. Wenn Sie also vor dem Beenden des Programms speichern möchten, sollten Sie dies berücksichtigen, indem Sie ihm etwas Zeit zum Beenden geben.
Vielleicht hat jemand ein paar nette Lösungen dafür, die er in den Kommentaren teilen kann?
quelle
NsUserDefaults speichert nur kleine variable Größen. Wenn Sie viele Objekte speichern möchten, können Sie CoreData als native Lösung verwenden, oder ich habe eine Bibliothek erstellt, mit der Sie Objekte so einfach wie die Funktion .save () speichern können. Es basiert auf SQLite.
SundeedQLite
Schau es dir an und sag mir deine Kommentare
quelle