iOS
NSUserDefaults
Buscar..
Sintaxis
UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults
-
UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults
-
Observaciones
NSUserDefault, que se utiliza para almacenar todo tipo de DataType, y puede obtener su valor en cualquier lugar de la clase de aplicación. NSUserDefault
Estableciendo valores
Para establecer un valor en NSUserDefaults
, puede usar las siguientes funciones:
Vencejo <3
setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)
Swift 3
En Swift 3, los nombres de la función se cambian para set
del set
seguido del tipo.
set(_:forKey:)
C objetivo
-(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;
Ejemplo de uso sería:
Vencejo <3
NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")
Swift 3
UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")
C objetivo
[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];
Objetos personalizados
Para guardar objetos personalizados en `NSUserDefaults`, debe hacer que su CustomClass confirme el protocolo de` NSCoding`. Necesitas implementar los siguientes métodos:Rápido
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
}
C objetivo
- (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"];
}
Obtención de valores predeterminados
Para obtener un valor en NSUserDefaults puede usar las siguientes funciones:
Rápido
arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)
C objetivo
-(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;
Ejemplo de uso sería:
Rápido
let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")
C objetivo
NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];
Valores de ahorro
NSUserDefaults
se escriben en el disco periódicamente por el sistema, pero hay ocasiones en las que desea que se guarden sus cambios inmediatamente, como cuando la aplicación pasa al estado de fondo. Esto se hace llamando al synchronize
.
Rápido
NSUserDefaults.standardUserDefaults().synchronize()
C objetivo
[[NSUserDefaults standardUserDefaults] synchronize];
Utilice a los gerentes para guardar y leer datos
Si bien puede usar los métodos de NSUserDefaults
cualquier lugar, a veces puede ser mejor definir un administrador que NSUserDefaults
y lea los NSUserDefaults
por usted y luego use ese administrador para leer o escribir sus datos.
Supongamos que queremos guardar la puntuación de un usuario en NSUserDefaults
. Podemos crear una clase como la de abajo que tiene dos métodos: setHighScore
y highScore
. En cualquier lugar donde desee acceder a las puntuaciones más altas, cree una instancia de esta clase.
Rápido
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;
}
}
}
}
C objetivo
#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
Las ventajas son que:
La implementación de su proceso de lectura y escritura es solo en un lugar y puede cambiarla (por ejemplo, cambiar de
NSUserDefaults
a Core Data) cuando lo desee y no preocuparse por cambiar todos los lugares en los que está trabajando con la puntuación más alta.Simplemente llame a un solo método cuando desee acceder a la puntuación o escríbalo.
Simplemente depúralo cuando veas un error o algo así.
Nota
Si le preocupa la sincronización, es mejor usar una clase singleton que administre la sincronización.
Borrar NSUserDefaults
Rápido
let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)
C objetivo
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];
Usos de UserDefaults en Swift 3
Todas las aplicaciones necesitaban almacenar la sesión del usuario o los detalles relacionados con el usuario dentro de la aplicación en UserDefaults. Por lo tanto, creamos toda la lógica dentro de una clase para administrar UserDefaults de una manera mejor.
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
}
}
Uso de la clase UserDefaults
//Saving user Details
Session.setUserSessionDetails(json ?? [:])
//Retriving user Details
let userId = Session.getUserValues(value: .userId) ?? ""