iOS
NSUserDefaults
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:
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.Wystarczy wywołać tylko jedną metodę, aby uzyskać dostęp do zapisu lub zapisu.
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) ?? ""