Caches et NSDictionary a partire du web
elf
Membre
Bonjour,
Pour gérer la mise à jour, mais aussi l'enregistrement (dialoguer avec mon serveur) j'utilise une bidouille asser simple et très pratique:
En gros ce code initialise le dictionnaire qui me dit si il y a une nouvelle version directement à partire de l'internet.
Le problème est que je crois que une fois que ça été initialisé il me le met en cache, et j'aimerais que il ne le cache pas: mais que il le recharge à chaque fois!
Comme faire cela?
Merci d'avance,
elf
Pour gérer la mise à jour, mais aussi l'enregistrement (dialoguer avec mon serveur) j'utilise une bidouille asser simple et très pratique:
- (void)lookForUpdate:(BOOL)forceCheck<br />{<br /> NSURL *versionFileURL = [NSURL URLWithString:URLDEPLISTENLIGNE];<br /> NSDictionary *plist = [[[NSDictionary alloc] initWithContentsOfURL:versionFileURL] autorelease];<br /> if(!plist)<br /> {<br /> NSLog(@"impossible de se connecter a ss pour verifier les updates");<br /> NSBeep();<br /> return;<br /> }<br /> NSString *vraiVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];<br /> NSString *newVersion = [plist objectForKey:@"version"]; <br /> <br /> if(!forceCheck && [newVersion isEqualToString:[prefs objectForKey:@"lastUpdateNotified"]])<br /> return;<br /> <br /> if(![vraiVersion isEqualToString:newVersion])<br /> {<br /> int alertPanelResult = NSRunAlertPanel(NSLocalizedString(@"UpdateAvaiableTitle", nil),<br /> [NSString stringWithFormat:NSLocalizedString(@"UpdateAvaiableMsg", nil),<br /> [plist objectForKey:@"version"]],<br /> NSLocalizedString(@"UpdateAvaiableDownload", nil),<br /> NSLocalizedString(@"UpdateAvaiableOK", nil),<br /> nil);<br /> if(alertPanelResult == NSOKButton)<br /> {<br /> [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:[plist objectForKey:@"downloadPage"]]];<br /> }<br /> else if(alertPanelResult == NSCancelButton)<br /> {<br /> [prefs setObject:newVersion forKey:@"lastUpdateNotified"];<br /> }<br /> else<br /> NSBeep();<br /> }<br />}<br />
En gros ce code initialise le dictionnaire qui me dit si il y a une nouvelle version directement à partire de l'internet.
Le problème est que je crois que une fois que ça été initialisé il me le met en cache, et j'aimerais que il ne le cache pas: mais que il le recharge à chaque fois!
Comme faire cela?
Merci d'avance,
elf
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu ne pourras plus utiliser initWithContentsOfURL mais ça va pas compliquer des masses les choses.
Je ne le savais pas avant d'aller à l'instant faire un tour dans la doc... donc bon je te laisse chercher je vais pas le faire à ta placeÂ
surtout que tu as déjà à priori tout ce qu'il te faut ici, enfin je pense.
Est-ce la manière correcte de procéder?
Ne seraice pas mieux de télécharger le fichier dans un dossier temporaire et de l'initaliser depuis le disque ensuite? SI oui, comment faire?
Je crois que la solution est de telecharger le fichier depuis le serveur (peutetre avec curl? mais ca m'air l'air tres compliquer pour rien...) sur le disque dans /tmp/... et de ll'ouvrire depuis le disque avec un [monDict initWithContentOfFile:path];
Mais comment faire ca en cocoa, quelqu'un aurrais un code?
Il faut passer par les méthodes adéquates de NSURLRequest ou autre classe exploitant un objet NSURLRequest pour récupérer le contenu du fichier, mais là j'ai pas encore pratiqué, mais je vais en avoir besoin bientôt, donc je vais pas tarder à tomber dedans.
Sinon, ton code comporte aussi des fuites mémoires :
[tt]
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
[/tt]
serait déjà mieux.
[tt]
-(void)startDL
{
   // Créer la requete
NSURLRequest *request=[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@URLFichier] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
   // Commencer le DL
NSURLDownload *download=[[NSURLDownload alloc] initWithRequest:request delegate:self];
[request release];
if (download)
{
     // Setter le fichier de destination
[download setDestination:@CheminFichierDestination allowOverwrite:YES];
}
else
{
NSLog(@DL fail);
}
}
-(void)downloadDidFinish:(NSURLDownload *)download
{
  [download release];
  NSLog(@DL Ok);
}
-(void)download:(NSURLDownload *)download didFailWithError:(NSError *)error
{
  [download release];
  NSLog(@DL failed! Error - %@ %@",
     [error localizedDescription],
     [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}
[/tt]
Les autres classes (comme NSURLConnection, NSURLHandle), permettent de travailler directement en mémoire mais il faut que le fichier comporte un NSData, donc cela implique d'utiliser NSArchiver pour encoder ton dictionary en NSData avant sa mise en ligne, et NSUnarchiver pour le décoder ensuite lors de sa récupération.