iOS
NSUserDefaults
Recherche…
Syntaxe
UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults
-
UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults
-
Remarques
NSUserDefault qui est utilisé pour stocker tout type de DataType, et vous pouvez obtenir sa valeur partout dans la classe de l'application. NSUserDéfault
Réglage des valeurs
Pour définir une valeur dans NSUserDefaults
, vous pouvez utiliser les fonctions suivantes:
Swift <3
setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)
Swift 3
Dans Swift 3, les noms de fonction sont modifiés pour set
insted de set
suivi par le type.
set(_:forKey:)
Objectif c
-(void)setBool:(BOOL)value forKey:(nonnull NSString *)defaultName;
-(void)setFloat:(float)value forKey:(nonnull NSString *)defaultName;
-(void)setInteger:(NSInteger)value forKey:(nonnull NSString *)defaultName;
-(void)setObject:(nullable id)value forKey:(nonnull NSString *)defaultName;
-(void)setDouble:(double)value forKey:(nonnull NSString *)defaultName;
-(void)setURL:(nullable NSURL *)value forKey:(nonnull NSString *)defaultName;
Exemple d'utilisation serait:
Swift <3
NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")
Swift 3
UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")
Objectif c
[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];
Objets personnalisés
Pour enregistrer des objets personnalisés dans le `NSUserDefaults`, vous devez faire en sorte que votre CustomClass confirme le protocole de` NSCoding`. Vous devez implémenter les méthodes suivantes:Rapide
public func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey:"name")
aCoder.encodeObject(unitId, forKey: "unitId")
}
required public init(coder aDecoder: NSCoder) {
super.init()
name = aDecoder.decodeObjectForKey("name") as? String
unitId = aDecoder.decodeIntegerForKey("unitId") as? NSInteger
}
Objectif c
- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
name = [coder decodeObjectForKey:@"name"];
unitId = [coder decodeIntegerForKey:@"unitId"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder*)coder {
[coder encodeObject:name forKey:@"name"];
[coder encodeInteger:unitId forKey:@"unitId"];
}
Obtenir des valeurs par défaut
Pour obtenir une valeur dans NSUserDefaults, vous pouvez utiliser les fonctions suivantes:
Rapide
arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)
Objectif c
-(nullable NSArray *)arrayForKey:(nonnull NSString *)defaultName;
-(BOOL)boolForKey:(nonnull NSString *)defaultName;
-(nullable NSData *)dataForKey:(nonnull NSString *)defaultName;
-(nullable NSDictionary<NSString *, id> *)dictionaryForKey:(nonnull NSString *)defaultName;
-(float)floatForKey:(nonnull NSString *)defaultName;
-(NSInteger)integerForKey:(nonnull NSString *)defaultName;
-(nullable id)objectForKey:(nonnull NSString *)key;
-(nullable NSArray<NSString *> *)stringArrayForKey:(nonnull NSString *)defaultName;
-(nullable NSString *)stringForKey:(nonnull NSString *)defaultName;
-(double)doubleForKey:(nonnull NSString *)defaultName;
-(nullable NSURL *)URLForKey:(nonnull NSString *)defaultName;
Exemple d'utilisation serait:
Rapide
let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")
Objectif c
NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];
Sauvegarder les valeurs
NSUserDefaults
est écrit sur le disque régulièrement par le système, mais il NSUserDefaults
que vous souhaitiez que vos modifications soient enregistrées immédiatement, par exemple lorsque l'application passe en arrière-plan. Cela se fait en appelant synchronize
.
Rapide
NSUserDefaults.standardUserDefaults().synchronize()
Objectif c
[[NSUserDefaults standardUserDefaults] synchronize];
Utiliser les gestionnaires pour enregistrer et lire des données
Bien que vous puissiez utiliser les méthodes NSUserDefaults
n'importe où, il est parfois préférable de définir un gestionnaire qui enregistre et lit à partir de NSUserDefaults
, puis utilise ce gestionnaire pour lire ou écrire vos données.
Supposons que nous voulions enregistrer le score d'un utilisateur dans NSUserDefaults
. Nous pouvons créer une classe comme celle ci-dessous qui a deux méthodes: setHighScore
et highScore
. Partout où vous voulez accéder aux meilleurs scores, créez une instance de cette classe.
Rapide
public class ScoreManager: NSObject {
let highScoreDefaultKey = "HighScoreDefaultKey"
var highScore = {
set {
// This method includes your implementation for saving the high score
// You can use NSUserDefaults or any other data store like CoreData or
// SQLite etc.
NSUserDefaults.standardUserDefaults().setInteger(newValue, forKey: highScoreDefaultKey)
NSUserDefaults.standardUserDefaults().synchronize()
}
get {
//This method includes your implementation for reading the high score
let score = NSUserDefaults.standardUserDefaults().objectForKey(highScoreDefaultKey)
if (score != nil) {
return score.integerValue;
} else {
//No high score available, so return -1
return -1;
}
}
}
}
Objectif c
#import "ScoreManager.h"
#define HIGHSCRORE_KEY @"highScore"
@implementation ScoreManager
- (void)setHighScore:(NSUInteger) highScore {
// This method includes your implementation for saving the high score
// You can use NSUserDefaults or any other data store like CoreData or
// SQLite etc.
[[NSUserDefaults standardUserDefaults] setInteger:highScore forKey:HIGHSCRORE_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (NSInteger)highScore
{
//This method includes your implementation for reading the high score
NSNumber *highScore = [[NSUserDefaults standardUserDefaults] objectForKey:HIGHSCRORE_KEY];
if (highScore) {
return highScore.integerValue;
}else
{
//No high score available, so return -1
return -1;
}
}
@end
Les avantages sont que:
L'implémentation de votre processus de lecture et d'écriture est seulement à un endroit et vous pouvez le changer (par exemple passer de
NSUserDefaults
à Core Data) quand vous le voulez et ne pas vous soucier de changer tous les endroits avec lesquels vous travaillez.Appelez simplement une seule méthode lorsque vous souhaitez accéder au score ou l'écrire.
Déboguez-le simplement quand vous voyez un bug ou quelque chose comme ça.
Remarque
Si vous vous inquiétez de la synchronisation, il est préférable d'utiliser une classe singleton qui gère la synchronisation.
Effacer NSUserDefaults
Rapide
let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)
Objectif c
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];
UserDefaults utilise dans Swift 3
Chaque application nécessaire pour stocker les détails liés à la session utilisateur ou à l’utilisateur dans l’application dans UserDefaults. Nous avons donc intégré toute une logique à une classe pour mieux gérer UserDefaults.
Swift 3
import Foundation
public struct Session {
fileprivate static let defaults = UserDefaults.standard
enum userValues: String {
case auth_token
case email
case fname
case mobile
case title
case userId
case userType
case OTP
case isApproved
}
//MARK: - Getting here User Details
static func getUserSessionDetails()->[String:AnyObject]? {
let dictionary = defaults.object(forKey: "LoginSession") as? [String:AnyObject]
return dictionary
}
//MARK: - Saving Device Token
static func saveDeviceToken(_ token:String){
guard (gettingDeviceToken() ?? "").isEmpty else {
return
}
defaults.removeObject(forKey: "deviceToken")
defaults.set(token, forKey: "deviceToken")
defaults.synchronize()
}
//MARK: - Getting Token here
static func gettingDeviceToken()->String?{
let token = defaults.object(forKey: "deviceToken") as? String
if token == nil{
return ""
}else{ return token}
}
//MARK: - Setting here User Details
static func setUserSessionDetails(_ dic :[String : AnyObject]){
defaults.removeObject(forKey: "LoginSession")
defaults.set(dic, forKey: "LoginSession")
defaults.synchronize()
}
//MARK:- Removing here all Default Values
static func userSessionLogout(){
//Set Activity
defaults.removeObject(forKey: "LoginSession")
defaults.synchronize()
}
//MARK: - Get value from session here
static func getUserValues(value: userValues) -> String? {
let dic = getUserSessionDetails() ?? [:]
guard let value = dic[value.rawValue] else{
return ""
}
return value as? String
}
}
Utilisation de la classe UserDefaults
//Saving user Details
Session.setUserSessionDetails(json ?? [:])
//Retriving user Details
let userId = Session.getUserValues(value: .userId) ?? ""