Szukaj…


Składnia

  • UserDefaults.standard.set(dic, forKey: "LoginSession") //Save value inside userdefaults

    • UserDefaults.standard.object(forKey: "LoginSession") as? [String:AnyObject] ?? [:] //Get value from UserDefaults

Uwagi

NSUserDefault, które są używane do przechowywania wszystkich typów DataType, i można uzyskać jego wartość w dowolnym miejscu w klasie aplikacji. NSUserDefault

Ustawianie wartości

Aby ustawić wartość w NSUserDefaults , możesz użyć następujących funkcji:

Szybki <3

setBool(_:forKey:)
setFloat(_:forKey:)
setInteger(_:forKey:)
setObject(_:forKey:)
setDouble(_:forKey:)
setURL(_:forKey:)

Szybki 3

W Swift 3 nazwy funkcji są zmieniane na set insted set naśladowanego przez typ.

set(_:forKey:) 

Cel 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;

Przykład użycia to:

Szybki <3

NSUserDefaults.standardUserDefaults.setObject("Netherlands", forKey: "HomeCountry")

Szybki 3

UserDefaults.standard.set("Netherlands", forKey: "HomeCountry")

Cel C

[[NSUserDefaults standardUserDefaults] setObject:@"Netherlands" forKey:@"HomeCountry"];

Niestandardowe obiekty

Aby zapisać niestandardowe obiekty w `NSUserDefaults`, musisz ustawić CustomClass na potwierdzenie protokołu` NSCoding`. Musisz wdrożyć następujące metody:

Szybki

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
}

Cel 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"];
}

Uzyskiwanie wartości domyślnych

Aby uzyskać wartość w NSUserDefaults, możesz użyć następujących funkcji:

Szybki

arrayForKey(_:)
boolForKey(_:)
dataForKey(_:)
dictionaryForKey(_:)
floatForKey(_:)
integerForKey(_:)
objectForKey(_:)
stringArrayForKey(_:)
stringForKey(_:)
doubleForKey(_:)
URLForKey(_:)

Cel 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;

Przykład użycia to:

Szybki

let homeCountry = NSUserDefaults.standardUserDefaults().stringForKey("HomeCountry")

Cel C

NSString *homeCountry = [[NSUserDefaults standardUserDefaults] stringForKey:@"HomeCountry"];

Zapisywanie wartości

NSUserDefaults są okresowo zapisywane na dysku przez system, ale są chwile, w których chcesz natychmiast zapisać zmiany, na przykład gdy aplikacja przechodzi w stan tła. Odbywa się to przez synchronize połączeń.

Szybki

NSUserDefaults.standardUserDefaults().synchronize()

Cel C

[[NSUserDefaults standardUserDefaults] synchronize];

Użyj menedżerów, aby zapisać i odczytać dane

Chociaż można używać metod NSUserDefaults dowolnym miejscu, czasem lepiej jest zdefiniować menedżera, który zapisuje i odczytuje z NSUserDefaults , a następnie użyć tego menedżera do odczytu lub zapisu danych.

Załóżmy, że chcemy zapisać wynik użytkownika w NSUserDefaults . Możemy stworzyć klasę podobną do tej, która ma dwie metody: setHighScore i highScore . Gdziekolwiek chcesz uzyskać dostęp do najlepszych wyników, utwórz instancję tej klasy.

Szybki

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;
            }
        }
    }
}

Cel 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

Zalety to:

  1. Wdrożenie procesu odczytu i zapisu odbywa się tylko w jednym miejscu i możesz je zmienić (na przykład przejść z NSUserDefaults do Core Data), kiedy chcesz i nie martw się o zmianę wszystkich miejsc, w których pracujesz z najlepszym wynikiem.

  2. Wystarczy wywołać tylko jedną metodę, aby uzyskać dostęp do zapisu lub zapisu.

  3. Po prostu debuguj go, gdy zobaczysz błąd lub coś takiego.

Uwaga

Jeśli martwisz się synchronizacją, lepiej jest użyć klasy singleton, która zarządza synchronizacją.

Usuwanie NSUserDefaults

Szybki

let bundleIdentifier = NSBundle.mainBundle().bundleIdentifier()

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundleIdentifier)

Cel C

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName: bundleIdentifier];

UserDefaults wykorzystuje w Swift 3

Każda aplikacja potrzebna do przechowywania sesji użytkownika lub szczegółów związanych z użytkownikiem wewnątrz aplikacji w UserDefault. Dlatego stworzyliśmy całą logikę wewnątrz klasy w celu lepszego zarządzania UserDefault.

Szybki 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
    }
    
}

Zastosowanie klasy UserDefaults

//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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow