Certaines applications liées aux photos iOS stockent des images créées avec l'application ailleurs que dans la photothèque. Par exemple, Fat Booth affiche une liste déroulante de photos créées avec l'application au démarrage de l'application. Notez que ces photos sont conservées sans que l'utilisateur les enregistre explicitement dans la photothèque. Quel est le moyen le plus simple de sauvegarder et de conserver des images dans une application iOS?
Les seuls magasins persistants que je connais sont NSUserDefaults et le porte-clés. Cependant, je n'ai jamais entendu parler de ceux-ci utilisés pour stocker de plus grandes quantités de données telles qu'une image. Maintenant, je me demande si Core Data est le moyen le plus simple.
Le moyen le plus simple consiste à l'enregistrer dans le répertoire Documents de l'application et à enregistrer le chemin avec NSUserDefaults comme ceci:
NSData *imageData = UIImagePNGRepresentation(newImage);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];
NSLog(@"pre writing to file");
if (![imageData writeToFile:imagePath atomically:NO])
{
NSLog(@"Failed to cache image data to disk");
}
else
{
NSLog(@"the cachedImagedPath is %@",imagePath);
}
Ensuite, enregistrez l'imagePath dans un dictionnaire dans NSUserDefaults ou comme vous le souhaitez, puis pour le récupérer, faites simplement:
NSString *theImagePath = [yourDictionary objectForKey:@"cachedImagePath"];
UIImage *customImage = [UIImage imageWithContentsOfFile:theImagePath];
Pour Swift:
let imageData = UIImagePNGRepresentation(selectedImage)
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let imagePath = paths.stringByAppendingPathComponent("cached.png")
if !imageData.writeToFile(imagePath, atomically: false)
{
println("not saved")
} else {
println("saved")
NSUserDefaults.standardUserDefaults().setObject(imagePath, forKey: "imagePath")
}
Pour Swift 2.1:
let imageData = UIImagePNGRepresentation(selectedImage)
let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
let imageURL = documentsURL.URLByAppendingPathComponent("cached.png")
if !imageData.writeToURL(imageURL, atomically: false)
{
print("not saved")
} else {
print("saved")
NSUserDefaults.standardUserDefaults().setObject(imageData, forKey: "imagePath")
}
stringByAppendingPathComponent
n'est pas disponible dans Swift 2.1 pour que vous puissiez utiliser URLByAppendingPathComponent.
Obtenez plus d'informations ici.
Vous pouvez le faire avec des données de base en stockant des données binaires, mais ce n'est pas recommandé . Il y a une bien meilleure façon, surtout pour les photos. Votre application dispose d'un répertoire de documents/fichiers auquel seule votre application peut accéder. Je recommande de commencer ici pour les concepts et comment y accéder. C'est relativement simple. Vous souhaiterez peut-être combiner cela avec des données de base pour stocker les chemins de fichiers, les métadonnées, etc. http://developer.Apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html