iOS
NSUserDefaults
Zoeken…
Syntaxis
UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults
-
UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults
-
Opmerkingen
NSUserDefault die wordt gebruikt om alle soorten DataType op te slaan, en u kunt de waarde overal in de klasse van de app krijgen. NSUserDefault
Waarden instellen
Om een waarde in te stellen in NSUserDefaults
, kunt u de volgende functies gebruiken:
Swift <3
setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)
Swift 3
In Swift 3 worden de namen van functies gewijzigd om in te set
van set
gevolgd door het type.
set(_:forKey:)
Doelstelling 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;
Voorbeeldgebruik zou zijn:
Swift <3
NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")
Swift 3
UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")
Doelstelling C
[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];
Aangepaste objecten
Om aangepaste objecten in de `NSUserDefaults` op te slaan, moet u uw CustomClass bevestigen aan het protocol van` NSCoding`. U moet de volgende methoden implementeren:Snel
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
}
Doelstelling 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"];
}
Standaardwaarden verkrijgen
Om een waarde in NSUserDefaults te krijgen, kunt u de volgende functies gebruiken:
Snel
arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)
Doelstelling 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;
Voorbeeldgebruik zou zijn:
Snel
let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")
Doelstelling C
NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];
Waarden opslaan
NSUserDefaults
worden periodiek naar de schijf geschreven door het systeem, maar er zijn momenten waarop u uw wijzigingen onmiddellijk wilt opslaan, zoals wanneer de app overgaat in de achtergrondstatus. Dit wordt gedaan door synchronize
aan te roepen.
Snel
NSUserDefaults.standardUserDefaults().synchronize()
Doelstelling C
[[NSUserDefaults standardUserDefaults] synchronize];
Gebruik managers om gegevens op te slaan en te lezen
Hoewel u de NSUserDefaults
methoden overal kunt gebruiken, is het soms beter om een manager te definiëren die voor u opslaat en leest uit NSUserDefaults
en die manager vervolgens te gebruiken voor het lezen of schrijven van uw gegevens.
Stel dat we de score van een gebruiker willen opslaan in NSUserDefaults
. We kunnen een klasse maken zoals die hieronder met twee methoden: setHighScore
en highScore
. Overal waar u toegang wilt tot de hoogste scores, maakt u een instantie van deze klasse.
Snel
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;
}
}
}
}
Doelstelling 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
De voordelen zijn dat:
De implementatie van uw lees- en schrijfproces vindt slechts op één plaats plaats en u kunt deze wijzigen (bijvoorbeeld overschakelen van
NSUserDefaults
naar Core Data) wanneer u maar wilt en u zich geen zorgen maakt over het wijzigen van alle plaatsen waar u met de hoogste score werkt.Roep eenvoudig maar één methode aan om toegang te krijgen om te scoren of te schrijven.
Foutopsporing eenvoudig wanneer u een bug of iets dergelijks ziet.
Notitie
Als u zich zorgen maakt over synchronisatie, is het beter om een singleton-klasse te gebruiken die de synchronisatie beheert.
NSUserDefaults wissen
Snel
let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)
Doelstelling C
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];
UserDefaults gebruikt in Swift 3
Elke applicatie moest User Session of User-gerelateerde details in de applicatie in UserDefaults opslaan. Dus hebben we hele logica in een klasse gemaakt om UserDefaults beter te beheren.
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
}
}
Gebruik van UserDefaults-klasse
//Saving user Details
Session.setUserSessionDetails(json ?? [:])
//Retriving user Details
let userId = Session.getUserValues(value: .userId) ?? ""