iOS
NSUserDefaults
Ricerca…
Sintassi
UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults
-
UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults
-
Osservazioni
NSUserDefault che vengono utilizzati per archiviare tutti i tipi di DataType, e puoi ottenere il loro valore ovunque nella classe dell'app. NSUserDefault
Impostazione dei valori
Per impostare un valore in NSUserDefaults
, è possibile utilizzare le seguenti funzioni:
Swift <3
setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)
Swift 3
A Swift 3 i nomi di funzione viene modificata per set
posto della set
folloed dal tipo.
set(_:forKey:)
Objective-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;
L'utilizzo di esempio potrebbe essere:
Swift <3
NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")
Swift 3
UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")
Objective-C
[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];
Oggetti personalizzati
Per salvare gli oggetti personalizzati in `NSUserDefaults` devi rendere CustomClass confermato al protocollo di` NSCoding`. È necessario implementare i seguenti metodi:veloce
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
}
Objective-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"];
}
Ottenere valori predefiniti
Per ottenere un valore in NSUserDefaults è possibile utilizzare le seguenti funzioni:
veloce
arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)
Objective-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;
L'utilizzo di esempio potrebbe essere:
veloce
let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")
Objective-C
NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];
Salvataggio dei valori
NSUserDefaults
sono scritti periodicamente sul disco dal sistema, ma ci sono momenti in cui si desidera che le modifiche vengano salvate immediatamente, ad esempio quando l'app passa allo stato di background. Questo viene fatto chiamando la synchronize
.
veloce
NSUserDefaults.standardUserDefaults().synchronize()
Objective-C
[[NSUserDefaults standardUserDefaults] synchronize];
Utilizzare i gestori per salvare e leggere i dati
Sebbene sia possibile utilizzare i metodi NSUserDefaults
ovunque, a volte può essere preferibile definire un gestore che salva e legge da NSUserDefaults
e quindi utilizzare tale gestore per leggere o scrivere i dati.
Supponiamo di voler salvare il punteggio di un utente in NSUserDefaults
. Possiamo creare una classe come quella qui sotto che ha due metodi: setHighScore
e highScore
. Ovunque tu voglia accedere ai punteggi più alti, crea un'istanza di questa classe.
veloce
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;
}
}
}
}
Objective-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
I vantaggi sono:
L'implementazione del processo di lettura e scrittura è solo in un punto e puoi cambiarla (ad esempio passare da
NSUserDefaults
a Core Data) ogni volta che vuoi e non preoccuparti di cambiare tutte le posizioni con cui lavori con il punteggio più alto.Basta chiamare un solo metodo quando si desidera accedere al punteggio o scriverlo.
Semplicemente esegui il debug quando vedi un bug o qualcosa di simile.
Nota
Se sei preoccupato per la sincronizzazione, è meglio usare una classe singleton che gestisca la sincronizzazione.
Cancellazione di NSUserDefaults
veloce
let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)
Objective-C
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];
UserDefaults utilizza in Swift 3
Tutte le applicazioni necessarie per archiviare la sessione utente oi dettagli relativi all'utente all'interno dell'applicazione in UserDefaults. Così abbiamo fatto tutta la logica all'interno di una classe per la gestione di UserDefaults in modo migliore.
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 della classe UserDefaults
//Saving user Details
Session.setUserSessionDetails(json ?? [:])
//Retriving user Details
let userId = Session.getUserValues(value: .userId) ?? ""