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:

  1. 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.

  2. Roep eenvoudig maar één methode aan om toegang te krijgen om te scoren of te schrijven.

  3. 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) ?? ""


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow