datos iphone objective-c cocoa-touch plist nsuserdefaults

iphone - datos - nsuserdefaults swift 4



¿Debo usar NSUserDefaults o un plist para almacenar datos? (9)

Guardaré algunas cuerdas (quizás 10-20). No estoy seguro de si debería usar NSUserDefaults para guardarlos o escribirlos en un plist. ¿Qué se considera la mejor práctica? Parece que NSUserDefaults tiene menos líneas de código, por lo tanto, es más rápido de implementar.

Me gustaría agregar que estos valores de cadena serán agregados / eliminados por el usuario.


Asumo una matriz, pero también funcionará con diccionarios.

Userdefaults, Core Data y Plists pueden leerse / escribirse, pero si usa un plist necesita prestar atención en qué dir lo pones. Vea la parte plist abajo.

Datos centrales Creo que es demasiado exagerado, solo son cadenas. Se supone que debe usarse cuando desee persistir objetos más complejos.

NSUserDefaults :

Es bastante rápido y fácil de hacer, aunque se supone que almacena solo la configuración del usuario. Para escribirlos en los valores predeterminados del usuario:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil]; [[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"]; [[NSUserDefaults standardUserDefaults] synchronize];

Para leer el de los userdefaults:

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"];

Plist :

Si va a modificar sus cadenas, tendrá que escribir y leer un plist pero no puede escribir en los recursos de su aplicación.

  1. Para tener una plist de lectura / escritura, primero encuentre el directorio de documentos

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];

  2. Crea la matriz (supongo que las cadenas son string1, ...)

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];

  3. Escribirlo en el archivo

    [stringsArray writeToFile:stringsPlistPath atomically:YES];

Para leer el plist:

  1. Encuentre el directorio de documentos

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];

  2. Léelo en:

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];


Depende de lo que quiere almacenar y por qué. NSUserDefaults está destinado a almacenar las preferencias del usuario. Puede intentar usarlo para otras cosas, pero probablemente no debería.

De lo contrario, si sus necesidades son simples, un archivo plist es bastante sencillo. También puede usar datos básicos o crear su propio formato de archivo. En general, utilizo plist para tareas simples y luego paso a datos básicos para cualquier cosa más compleja.


La forma recomendada de conservar datos como este es usar datos básicos. Si bien NSUserDefaults se puede usar para almacenar más o menos cualquier cosa, se supone que solo se debe usar para almacenar preferencias.


NSUserDefaults almacenará las preferencias del usuario en un archivo en la carpeta Biblioteca / Preferencias. En teoría, sirve solo para almacenar algunas aplicaciones / propiedades de usuario.

El archivo Plist es útil para administrar un solo archivo. Si necesita administrar más, debe usar Coredata. No hay restricciones sobre el tamaño del archivo plist. De lo contrario, debe tener cuidado con el archivo plist, ya que cuando necesite guardarlo o leerlo, todo el contenido del archivo se cargará en la memoria.


Si está almacenando de 10 a 20 cadenas y no está buscando demasiadas líneas de código, los datos básicos son, sin duda, demasiada sobrecarga. Recomiendo ir con el plist. No hay mucho código:

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"]; NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL];


Usar una plist es una buena opción para almacenar sus cadenas si las cadenas no son solo configuraciones de usuario que pueden ir en NSUserDefaults. Como se mencionó, al usar un plist debe almacenar su plist en el directorio de Documentos para poder escribir en él, porque no puede escribir en los recursos de su propia aplicación. Cuando aprendí esto por primera vez, no tenía claro dónde estaba el directorio de Bundle de su propia aplicación y dónde estaba el directorio de Documentos, así que pensé en publicar aquí un código de ejemplo que primero copia una plist llamada "Strings.plist" (esa que ya tiene en el directorio Bundle de su propia aplicación) en el directorio de Documentos, y luego escribe y lee desde allí.

// Make a path to the plist in the Documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPathIndDoc = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"]; // Make a path to the plist in your app''s Bundle directory NSString *stringsPlistPathInBundle = [[NSBundle mainBundle] pathForResource:@"Strings" ofType:@".plist"]; NSFileManager *fileManager = [NSFileManager defaultManager]; // Check first that you haven''t already copied this plist to the Documents directory if (![fileManager fileExistsAtPath:stringsPlistPathIndDoc]) { NSError *error; // Copy the plist from the Bundle directory to the Documents directory [fileManager copyItemAtPath:stringsPlistPathInBundle toPath:stringsPlistPathIndDoc error:&error]; } // Write your array out to the plist in the Documents directory NSMutableArray *stringsArray = [[NSMutableArray alloc] initWithObjects:@"string1", @"string2", @"string3", nil]; [stringsArray writeToFile:stringsPlistPathIndDoc atomically:YES]; // Later if you want to read it: stringsArray = [[NSMutableArray alloc] initWithContentsOfFile:stringsPlistPathIndDoc];


iOS finalmente almacena todos los datos NSUserDefaults en un archivo plist. Por lo tanto, no afectará el rendimiento si esa es su preocupación. Personalmente, prefiero usar NSUserDefaults para datos pequeños y plist para un conjunto relativamente grande de datos.

Nota: Nunca almacene ninguna información sensible en NSUserDefaults ya que cualquiera puede ver esa información.


NSUSerDefaults es realmente rápido de implementar, pero sobre todo a medida que crece la aplicación, desea almacenar más y más, fui directamente a los archivos plist.

En su mayoría, la gente quiere almacenar una lista de algo, así que aquí está mi parte de cómo hacer esto con NSDictionary. Esto no requiere que primero cree un archivo plist, se creará la primera vez que se guarde algo

xcode 7 beta, Swift 2.0

ahorro

func SaveItemFavorites(items : Array<ItemFavorite>) -> Bool { let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray let docuDir = paths.firstObject as! String let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath) let filemanager = NSFileManager.defaultManager() let array = NSMutableArray() for var i = 0 ; i < items.count ; i++ { let dict = NSMutableDictionary() let ItemCode = items[i].ItemCode as NSString dict.setObject(ItemCode, forKey: "ItemCode") //add any aditional.. array[i] = dict } let favoritesDictionary = NSDictionary(object: array, forKey: "favorites") //check if file exists if(!filemanager.fileExistsAtPath(path)) { let created = filemanager.createFileAtPath(path, contents: nil, attributes: nil) if(created) { let succeeded = favoritesDictionary.writeToFile(path, atomically: true) return succeeded } return false } else { let succeeded = notificationDictionary.writeToFile(path, atomically: true) return succeeded } }

Pequeña nota de los documentos:

NSDictionary.writeToFile (ruta: atómicamente :)

Este método valida recursivamente que todos los objetos contenidos son objetos de lista de propiedades (instancias de NSData , NSDate , NSNumber , NSString , NSArray o NSDictionary ) antes de escribir el archivo, y devuelve NO si todos los objetos no son objetos de lista de propiedades, ya que el archivo resultante no sería una lista de propiedades válida.

Entonces, lo que establezca en dict.SetObject() debería ser uno de los tipos mencionados anteriormente.

cargando

private let ItemFavoritesFilePath = "ItemFavorites.plist" func LoadItemFavorites() -> Array<ItemFavorite> { let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray let docuDir = paths.firstObject as! String let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath) let dict = NSDictionary(contentsOfFile: path) let dictitems : AnyObject? = dict?.objectForKey("favorites") var favoriteItemsList = Array<ItemFavorite>() if let arrayitems = dictitems as? NSArray { for var i = 0;i<arrayitems.count;i++ { if let itemDict = arrayitems[i] as? NSDictionary { let ItemCode = itemDict.objectForKey("ItemCode") as? String //get any additional let ItemFavorite = ItemFavorite(item: ItemCode) favoriteItemsList.append(ItemFavorite) } } } return favoriteItemsList }


Usando .plist

  1. Crea un plist utilizando Xcode

Escribe un valor a plist

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"settings" withExtension:@"plist"]; NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL]; [dict setValue:@"value" forKey:@"key"]; [dict writeToURL:plistURL atomically:YES];

Lee un valor de plist

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL]; NSString *myValue = [dict valueForKey:@"key"];