Persistencia de datos
UserDefaults
Es la interface para configuracion default de ususario, donde se almacenan parejas de key-value
persistentes a traves de la aplicacion.
Cuando usar
- Cuando son configuraciones basicas del usuario
- Cuando no importa que los datos esten expuestos
- Cuando usamos primitivas de objective-c NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary
- Cuando queremos guardar configuraciones de ambiente
- Cuando queremos un acceso facil en toda la aplicacion
Como usar
UserDefaults.standard.set(true, forKey: "myKey")
UserDefaults.standard.<dataType>(forKey: "myKey")
Nota
Para situaciones donde se requiere almacenar datos de manera segura se recomienda utilizar Keychain ya que al contrario de UserDefaults donde se tiene en un archivo de texto plano, keychain encripta la informacion.
FileManager(Archivos en Disco)
Es un objeto que provee una interface de conveniencia a los contenidos del sistema de archivo.
Cuando usar
- Persistencia de clases archivables que hereden de
NSCoder
interface o datos. - Facilidad de uso y baja complejidad de datos.
- Cache de datos
- Persistencia de imagenes y datos binarios
Como usar
Uso de directorios SearchPathDirectory
- .documentDirectory User/Documents
- .cachesDirectory Lib/Cache
Manejo de Directorios
var url = FileManager.default.urls(for: SearchPathDirectory, in: .userDomainMask).first!
let subfolder = "my-subfolder"
url.appendPathComponent(subfolder)
Crear Directorios
try fileManager.createDirectory(at: url, withIntermediateDirectories: false, attributes: nil)
¿Existe el archivo? ¿Es directorio?
var isDir: ObjCBool = false
let fileExits = FileManager.default.fileExists(atPath: folder.path, isDirectory: &isDir)
Eliminar el archivo
try fileManager.removeItem(at: url)
NSKeyedArchiver / NSKeyedUnarchiver
Salvar archivo (Deprecated)
NSKeyedArchiver.archiveRootObject(<NSCoder>, toFile: url.path)
Abrir archivo (Deprecated)
NSKeyedUnarchiver.unarchiveObject(withFile: url.path)
Codable
Salvar codable
let json = try JSONEncoder().encode(<Codable instance>)
try json.write(to: url)
Abrir codable
if let data = try? Data(contentsOf: url) {
return try JSONDecoder().decode(<Codable>.self, from: data)
}
NSCache
Una colección mutable que se utiliza para almacenar temporalmente en memoria datos transitorios. Se maneja de manera similar a un diccionario o lo que se conoce en NoSQL key-value store. Los datos que están sujetos a liberacion arbitraria por parte del sistema operativo cuando los recursos son bajos.
Cuando usar
Normalmente, NSCache se utiliza para almacenar temporalmente objetos con datos transitorios que son costosos de crear. La reutilización de estos objetos puede proporcionar beneficios de rendimiento, ya que sus valores no tienen que volver a calcularse. Sin embargo, los objetos deven de no ser críticos para la aplicación ya se pueden descartar por el sistema operativo cuando requiera mayor uso de memoria y esta sea limitada.
Como usar
let cache = NSCache<NSString, Any>()
Set Object
cache.setObject(image, forKey: key as NSString)
Get Object
cache.object(forKey: key as NSString)
CoreData
Contrario a la creencian CoreData NO es un ORM, ya que se cuenta con features mas extensos que permiten el manejo de datos a manera de control de versiones, por lo que muy pocos escenarios lo requieren, ademas que la implementacion y el mantenimiento es complejo.