iOS
NSUserDefaults
Suche…
Syntax
UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults
-
UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults
-
Bemerkungen
NSUserDefault, die zum Speichern aller Datentypen verwendet werden, und der Wert kann an einer beliebigen Stelle in der App-Klasse abgerufen werden. NSUserDefault
Einstellwerte
Um einen Wert in NSUserDefaults
, können Sie die folgenden Funktionen verwenden:
Schnell <3
setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)
Swift 3
In Swift 3 die Namen der Funktion geändert set
von insted set
durch den Typ folloed.
set(_:forKey:)
Ziel 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;
Ein Beispiel wäre:
Schnell <3
NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")
Swift 3
UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")
Ziel c
[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];
Benutzerdefinierte Objekte
Um benutzerdefinierte Objekte in den "NSUserDefaults" zu speichern, müssen Sie Ihre CustomClass mit dem Protokoll "NSCoding" bestätigen. Sie müssen die folgenden Methoden implementieren:Schnell
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
}
Ziel 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"];
}
Standardwerte abrufen
Um einen Wert in NSUserDefaults zu erhalten, können Sie die folgenden Funktionen verwenden:
Schnell
arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)
Ziel 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;
Ein Beispiel wäre:
Schnell
let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")
Ziel c
NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];
Werte speichern
NSUserDefaults
werden vom System regelmäßig auf die Festplatte geschrieben. Es kann jedoch vorkommen, dass Ihre Änderungen sofort gespeichert werden sollen, z. Dies geschieht durch Aufruf von synchronize
.
Schnell
NSUserDefaults.standardUserDefaults().synchronize()
Ziel c
[[NSUserDefaults standardUserDefaults] synchronize];
Verwenden Sie Manager zum Speichern und Lesen von Daten
Sie können die NSUserDefaults
Methoden zwar überall verwenden, es kann jedoch manchmal besser sein, einen Manager zu definieren, der NSUserDefaults
speichert und von NSUserDefaults
liest, und diesen Manager dann zum Lesen oder Schreiben Ihrer Daten zu verwenden.
Angenommen, wir möchten die Punktzahl eines Benutzers in NSUserDefaults
. Wir können eine Klasse wie die folgende erstellen, die zwei Methoden hat: setHighScore
und highScore
. Erstellen Sie eine Instanz dieser Klasse, wenn Sie auf die Highscores zugreifen möchten.
Schnell
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;
}
}
}
}
Ziel 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
Die Vorteile sind:
Die Implementierung Ihres Lese- und Schreibprozesses ist nur an einem Ort und Sie können ihn jederzeit ändern (z. B. von
NSUserDefaults
zu Core Data wechseln), ohne sich Sorgen zu machen, alle Orte zu ändern, an denen Sie mit dem Highscore arbeiten.Rufen Sie einfach nur eine Methode auf, wenn Sie auf die Partitur zugreifen oder sie schreiben möchten.
Debuggen Sie es einfach, wenn Sie einen Fehler oder ähnliches sehen.
Hinweis
Wenn Sie sich Sorgen um die Synchronisierung machen, ist es besser, eine Singleton-Klasse zu verwenden, die die Synchronisation verwaltet.
NSUserDefaults löschen
Schnell
let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)
Ziel c
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];
UserDefaults wird in Swift 3 verwendet
Jede Anwendung musste zum Speichern von Benutzersitzungen oder benutzerbezogenen Details in der Anwendung in UserDefaults verwendet werden. Daher haben wir die gesamte Logik innerhalb einer Klasse für die Verwaltung von UserDefaults verbessert.
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
}
}
Verwendung der UserDefaults-Klasse
//Saving user Details
Session.setUserSessionDetails(json ?? [:])
//Retriving user Details
let userId = Session.getUserValues(value: .userId) ?? ""