Equivalente de iOS para preferencias compartidas de Android

105

Estoy portando una aplicación de Android a iOS, una cosa que usé fueron las Preferencias compartidas en Android para guardar cada vez que se completaba un nivel.

De esa manera, cuando el usuario vuelve a la aplicación, puede ver que está en el nivel 3 o lo que sea.

¿Existe un mecanismo similar en iOS? ¿O tengo que escribir manualmente en un archivo específico de la aplicación?

Si es así, ¿cómo escribo en archivos solo visibles para mi aplicación?

Gracias.

Gusano caprichoso
fuente
1
Supongo que lo más parecido a esto en iOS es NSUserDefaults . Y aquí hay un ejemplo simple de cómo guardar y recuperar.
Tarek Hallak

Respuestas:

203

Use NSUserDefaults : tenga en cuenta que esto es para pequeños bits de datos, como el nivel actual como mencionó. No abuse de esto y utilícelo como una gran base de datos, porque se carga en la memoria cada vez que abre su aplicación, ya sea que necesite algo de ella o no (otras partes de su aplicación también lo usarán).

C objetivo:

Leyendo:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

Escritura:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

Rápido:

Leyendo:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

Escritura:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}
Algún chico
fuente
También puede usar el enlace condicional para leer en swift if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = SavedLevel}
Raghu Teja
4
@chitti no, eso no funcionará, integerForKey no devuelve un opcional
SomeGuy
40

Aquí hay una actualización para Swift 3

Leyendo

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

Escritura

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

Actualizar

De la documentación de UserDefaults

synchronize()espera cualquier actualización asincrónica pendiente de la base de datos predeterminada y regresa; este método ahora es innecesario y no debe usarse.

Ben
fuente
2
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

Ejemplo

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")
Hasanaga
fuente
-1

Según la respuesta anterior, ya sabe que UserDefaultses el equivalente a las preferencias compartidas en ios. Puede crear una función de escritura común y una función de creación de lectura basada en el tipo de datos. Y llame a su método requerido desde cualquier lugar.

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
Md Imran Choudhury
fuente