2010-04-12 8 views
2

J'ai développé une application pour iPhone ces derniers mois. Récemment, j'ai voulu améliorer les performances et mettre en cache quelques-unes des images utilisées dans l'interface utilisateur. Les images sont téléchargées aléatoirement sur le Web par l'utilisateur, donc je ne peux pas ajouter d'images spécifiques au projet. J'utilise également déjà NSUserDefaults pour enregistrer d'autres informations dans l'application.iPhone - Valeurs par défaut et UIImages

Alors maintenant, je tente de sauver un dictionnaire de UIImages à mes NSUserDefaults objet et obtenir ...

- [UIImage encodeWithCoder:]: sélecteur non reconnu envoyé à l'instance

Je décide alors de sous-classe UIImage avec une classe nommée UISaveableImage et implémente NSCoding. Donc maintenant je suis à ...

@implementation UISaveableImage 

-(void)encodeWithCoder:(NSCoder *)encoder 
{ 
    [encoder encodeObject:super forKey:@"image"]; 
} 

-(id)initWithCoder:(NSCoder *)decoder 
{ 
    if (self=[super init]){ 
     super = [decoder decodeObjectForKey:@"image"]; 
    } 
    return self; 
} 

@end 

ce qui n'est pas mieux que là où j'ai commencé. Si j'étais capable de convertir un UIImage en NSData, je serais bien, mais tout ce que je peux trouver sont des fonctions comme UIImagePNGRepresentation qui nécessitent que je sache quel type d'image c'était. Quelque chose que UIImage ne me permet pas de faire. Pensées? J'ai l'impression d'avoir erré dans le mauvais sens ...

+0

La réponse de Ben est correcte, mais votre hypothèse selon laquelle vous devez connaître le type de fichier est incorrecte. UIImagePNGRepresentation renvoie le NSData en tant que fichier PNG, quel que soit le format dans lequel il se trouvait lorsqu'il a été chargé. –

Répondre

6

Vous ne voulez pas stocker d'images dans NSUserDefaults. Ce sont de grosses tâches de données, et NSUserDefaults est stocké en tant que plist; vous voulez écrire de petits morceaux d'information.

Vous devriez écrire les images sur le disque, puis stocker les noms de fichiers par défaut:

NSString *filename = myImageFilename; 
[UIImagePNGRepresentation(image) writeToFile: myImageFilename atomically]; 
[[NSUserDefaults standardDefaults] setObject: myImageFilename forKey: @"lastImageFilename"]; 
+0

J'ai compris. Question de suivi Comment la mémoire est-elle gérée sur le disque? Y a-t-il une méthode de type "removeFromFile" correspondante? – Staros

+0

Jetez un coup d'œil à NSFileManager. Il y a un -removeItemAtPath: error: méthode là qui fera ce que vous voulez. –

1

Trébuchant sur cette un an plus tard. J'ajouterais (au cas où quelqu'un d'autre trébucherait aussi ici) que vous devriez stocker les images dans le répertoire cache et éviter qu'iTunes essaye de les sauvegarder.

- (NSString *)pathForSearchPath:(NSSearchPathDirectory)searchPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPath, NSUserDomainMask, YES); 
    NSString *directoryPath = [paths objectAtIndex:0]; 
    return directoryPath; 
} 

- (NSString *)cacheDirectoryPath { 
    return [self pathForSearchPath:NSCachesDirectory]; 
}