iOS
NSUserDefaults
Sök…
Syntax
UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults
-
UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults
-
Anmärkningar
NSUserDefault som används för att lagra alla typer av DataType, och du kan få dess värde var som helst i klassen av app. NSUserDefault
Ställa in värden
För att ställa in ett värde i NSUserDefaults
kan du använda följande funktioner:
Snabb <3
setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)
Snabb 3
I Swift 3 ändras funktionens namn för att set
inställd på set
följt av typen.
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;
Exempel på användning skulle vara:
Snabb <3
NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")
Snabb 3
UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")
Objective-C
[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];
Anpassade objekt
För att spara anpassade objekt i `NSUserDefaults` måste du göra din CustomClass bekräfta till protokollet för` NSCoding`. Du måste implementera följande metoder:Snabb
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"];
}
Få standardvärden
För att få ett värde i NSUserDefaults kan du använda följande funktioner:
Snabb
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;
Exempel på användning skulle vara:
Snabb
let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")
Objective-C
NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];
Spara värden
NSUserDefaults
skrivs till disken regelbundet av systemet, men det finns tillfällen när du vill att dina ändringar ska sparas omedelbart, till exempel när appen övergår till bakgrundstillstånd. Detta görs genom att synchronize
samtal.
Snabb
NSUserDefaults.standardUserDefaults().synchronize()
Objective-C
[[NSUserDefaults standardUserDefaults] synchronize];
Använd chefer för att spara och läsa data
Medan du kan använda NSUserDefaults
metoderna var som helst, kan det ibland vara bättre att definiera en manager som sparar och läser från NSUserDefaults
för dig och sedan använda den hanteraren för att läsa eller skriva dina data.
Anta att vi vill spara en användares poäng i NSUserDefaults
. Vi kan skapa en klass som den nedan som har två metoder: setHighScore
och highScore
. Oavsett var du vill få hög poäng skapar du en instans av den här klassen.
Snabb
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
Fördelarna är att:
Implementeringen av din läs- och skrivprocess är bara på ett ställe och du kan ändra den (till exempel byta från
NSUserDefaults
till Core Data) när du vill och inte oroa dig för att ändra alla platser som du arbetar med hög poäng.Ring bara en metod när du vill komma åt poäng eller skriva den.
Felsök bara det när du ser ett fel eller något liknande.
Notera
Om du är orolig för synkronisering är det bättre att använda en singleton-klass som hanterar synkroniseringen.
Rensar NSUserDefaults
Snabb
let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)
Objective-C
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];
UserDefaults använder i Swift 3
Varje applikation som behövs för att lagra användarsession eller användarrelaterad information inuti applikationen i UserDefaults.So vi gjorde hela logiken i en klass för att hantera UserDefaults bättre sätt.
Snabb 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
}
}
Användning av UserDefaults Class
//Saving user Details
Session.setUserSessionDetails(json ?? [:])
//Retriving user Details
let userId = Session.getUserValues(value: .userId) ?? ""