Ott 21
Controllare aggiornamento di un file remoto con object-c e cocoatouch
cocos2d, iPad, iPhone, MacOSX | Soft! | Commenta l'articolo |
Un modo semplice e veloce per controllare se un file è aggiornato è controllare la sua data di modifica. Per fare questo cocoa-touch ci offre delle librerie che lo fanno senza scrivere troppe linee di codice. Ecco un esempio:
- (void)downloadFileIfUpdated { NSString *urlString = ... your URL ... DLog(@"Downloading HTTP header from: %@", urlString); NSURL *url = [NSURL URLWithString:urlString]; NSString *cachedPath = ... path to your cached file ... NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL downloadFromServer = NO; NSString *lastModifiedString = nil; NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSHTTPURLResponse *response; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: nil]; if ([response respondsToSelector:@selector(allHeaderFields)]) { lastModifiedString = [[response allHeaderFields] objectForKey:@"Last-Modified"]; } NSDate *lastModifiedServer = nil; @try { NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'"; df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; lastModifiedServer = [df dateFromString:lastModifiedString]; } @catch (NSException * e) { NSLog(@"Error parsing last modified date: %@ - %@", lastModifiedString, [e description]); } DLog(@"lastModifiedServer: %@", lastModifiedServer); NSDate *lastModifiedLocal = nil; if ([fileManager fileExistsAtPath:cachedPath]) { NSError *error = nil; NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:cachedPath error:&error]; if (error) { NSLog(@"Error reading file attributes for: %@ - %@", cachedPath, [error localizedDescription]); } lastModifiedLocal = [fileAttributes fileModificationDate]; DLog(@"lastModifiedLocal : %@", lastModifiedLocal); } // Download file from server if we don't have a local file if (!lastModifiedLocal) { downloadFromServer = YES; } // Download file from server if the server modified timestamp is later than the local modified timestamp if ([lastModifiedLocal laterDate:lastModifiedServer] == lastModifiedServer) { downloadFromServer = YES; } if (downloadFromServer) { DLog(@"Downloading new file from server"); NSData *data = [NSData dataWithContentsOfURL:url]; if (data) { // Save the data if ([data writeToFile:cachedPath atomically:YES]) { DLog(@"Downloaded file saved to: %@", cachedPath); } // Set the file modification date to the timestamp from the server if (lastModifiedServer) { NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:lastModifiedServer forKey:NSFileModificationDate]; NSError *error = nil; if ([fileManager setAttributes:fileAttributes ofItemAtPath:cachedPath error:&error]) { DLog(@"File modification date updated"); } if (error) { NSLog(@"Error setting file attributes for: %@ - %@", cachedPath, [error localizedDescription]); } } } } }
Un pezzo di codice trovato in rete che realizza tutto quello che ho scritto. Non servono molti commenti, perchè sono già presenti nel codice e una possibile ottimizzazione è quella di realizzare la chiamata in maniera asincrona, differentemente da quella proposta.
Se avete domande per comprendere meglio l’esempio fatele pure, sono a vostra disposizione.
Ultimi Commenti