Je travaille actuellement sur une application iOS développée en Swift et j'ai besoin de stocker sur l'appareil le contenu créé par l'utilisateur, mais je n'arrive pas à trouver un moyen simple et rapide de stocker/recevoir les utilisateurs. contenu sur l'appareil.
Quelqu'un pourrait-il expliquer comment stocker et accéder au stockage local?
L'idée est de stocker les données lorsque l'utilisateur exécute une action et de les recevoir au démarrage de l'application.
La solution la plus simple si vous ne stockez que deux chaînes est NSUserDefaults
. Dans Swift 3, cette classe a été renommée en UserDefaults
.
Il est préférable de stocker vos clés quelque part dans le monde afin de pouvoir les réutiliser ailleurs dans votre code.
struct defaultsKeys {
static let keyOne = "firstStringKey"
static let keyTwo = "secondStringKey"
}
// Setting
let defaults = UserDefaults.standard
defaults.set("Some String Value", forKey: defaultsKeys.keyOne)
defaults.set("Another String Value", forKey: defaultsKeys.keyTwo)
// Getting
let defaults = UserDefaults.standard
if let stringOne = defaults.string(forKey: defaultsKeys.keyOne) {
print(stringOne) // Some String Value
}
if let stringTwo = defaults.string(forKey: defaultsKeys.keyTwo) {
print(stringTwo) // Another String Value
}
// Setting
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Some String Value", forKey: defaultsKeys.keyOne)
defaults.setObject("Another String Value", forKey: defaultsKeys.keyTwo)
// Getting
let defaults = NSUserDefaults.standardUserDefaults()
if let stringOne = defaults.stringForKey(defaultsKeys.keyOne) {
print(stringOne) // Some String Value
}
if let stringTwo = defaults.stringForKey(defaultsKeys.keyTwo) {
print(stringTwo) // Another String Value
}
Pour tout ce qui est plus sérieux que la configuration mineure, les drapeaux ou les chaînes de base, vous devez utiliser une sorte de magasin persistant - Une option populaire pour le moment est Realm mais vous pouvez également utiliser SQLite ou Pommes très propres CoreData .
Ils disent Utiliser NSUserDefaults
Lorsque j'ai implémenté le stockage de données à long terme (après la fermeture de l'application) pour la première fois, tout ce que j'ai lu en ligne m'a dirigé vers NSUserDefaults. Cependant, je voulais stocker un dictionnaire et, bien que possible, cela s’avérait être une douleur. J'ai passé des heures à essayer de faire disparaître les fautes de frappe.
NSUserDefaults est également limité dans la fonction
Des lectures supplémentaires ont révélé comment la lecture/écriture de NSUserDefaults force réellement l'application à lire/écrire tout ou rien, tout à la fois, de sorte qu'elle n'est pas efficace. Ensuite, j'ai appris que la récupération d'un tableau n'est pas simple. J'ai réalisé que si vous stockez plus que quelques chaînes ou booléens, NSUserDefaults n'est vraiment pas idéal.
Ce n'est pas non plus évolutif. Si vous apprenez à coder, apprenez de manière évolutive. Utilisez uniquement NSUserDefaults pour stocker des chaînes simples ou des booléens liés aux préférences. Stockez des matrices et d’autres données avec Core Data, ce n’est pas aussi difficile qu’ils le disent. Commencez petit.
Mise à jour: De plus, si vous ajoutez Apple Watch Support, il existe un autre facteur à considérer. Le NSUserDefaults de votre application est maintenant automatiquement envoyé à Watch Watch.
Utilisation des données de base
J'ai donc ignoré les avertissements selon lesquels Core Data est une solution plus difficile et j'ai commencé à lire. Dans les trois heures, je le faisais fonctionner. J'ai eu mon tableau de table en cours d'enregistrement dans Core Data et recharger les données lors de la sauvegarde de l'application! Le code du didacticiel était assez facile à adapter et j’ai pu le faire stocker à la fois des tableaux de titres et de détails avec un peu plus d’expérimentation.
Par conséquent, si vous lisez ce billet et que vous rencontrez des problèmes de type NSUserDefault ou dont le besoin dépasse le simple stockage de chaînes, envisagez de passer une heure ou deux à jouer avec des données de base.
Voici le tutoriel que j'ai lu:
http://www.raywenderlich.com/85578/first-core-data-app-using-Swift
Si vous n'avez pas coché "Données de base"
Si vous n'avez pas coché "Core Data" lors de la création de votre application, vous pouvez l'ajouter après et cela ne prend que cinq minutes:
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
Comment supprimer des listes de données de base
Okey alors merci à @ bploat et au lien vers http://www.codingexplorer.com/nsuserdefaults-a-Swift-introduction/
J'ai trouvé que la réponse est assez simple pour un stockage de chaîne de base.
let defaults = NSUserDefaults.standardUserDefaults()
// Store
defaults.setObject("theGreatestName", forKey: "username")
// Receive
if let name = defaults.stringForKey("username")
{
print(name)
// Will output "theGreatestName"
}
Je l'ai résumé ici http://ridewing.se/blog/save-local-data-in-Swift/
L'utilisation de NSCoding and NSKeyedArchiver est une autre excellente option pour les données trop complexes pour NSUserDefaults
, mais pour lesquelles CoreData serait excessif. Cela vous donne également la possibilité de gérer la structure de fichiers de manière plus explicite, ce qui est très bien si vous souhaitez utiliser le cryptage.
Pour Swift 4.0, cela est devenu plus facile:
let defaults = UserDefaults.standard
//Set
defaults.set(passwordTextField.text, forKey: "Password")
//Get
let myPassword = defaults.string(forKey: "Password")
Swift 3.
Setter: Local Storage
let authtoken = "12345"
// Userdefaults helps to store session data locally
let defaults = UserDefaults.standard
defaults.set(authtoken, forKey: "authtoken")
defaults.synchronize()
Getter: Stockage local
if UserDefaults.standard.string(forKey: "authtoken") != nil {
//perform your task on success }
Pour Swift 3
UserDefaults.standard.setValue(token, forKey: "user_auth_token")
print("\(UserDefaults.standard.value(forKey: "user_auth_token")!)")
Pour quelqu'un qui ne préfère pas gérer UserDefaults pour certaines raisons, il existe une autre option - NSKeyedArchiver & NSKeyedUnarchiver. Il permet d’enregistrer des objets dans un fichier à l’aide d’Archiver et de charger le fichier archivé dans les objets d’origine.
// To archive object,
let mutableData: NSMutableData = NSMutableData()
let archiver: NSKeyedArchiver = NSKeyedArchiver(forWritingWith: mutableData)
archiver.encode(object, forKey: key)
archiver.finishEncoding()
return mutableData.write(toFile: path, atomically: true)
// To unarchive objects,
if let data = try? Data(contentsOf: URL(fileURLWithPath: path)) {
let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
let object = unarchiver.decodeObject(forKey: key)
}
J'ai écrit un utilitaire simple pour enregistrer/charger des objets dans un stockage local. J'ai utilisé les exemples de codes ci-dessus. Vous voudrez peut-être voir ceci. https://github.com/DragonCherry/LocalStorage