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:

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

  2. Rufen Sie einfach nur eine Methode auf, wenn Sie auf die Partitur zugreifen oder sie schreiben möchten.

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow