iOS – 仅在修改时下载文件(NSURL和NSData)

我正在从服务器上下载一大堆图像文件,而且我想确保只有在更新的情况下才能下载它们。 这种方法目前下载图像就好了。 但是,我不想浪费时间或精力重新下载图像,每次用户login到应用程序。 相反,我只想下载任何文件A)不存在B)在服务器上比在设备上更新

这里是我如何下载图像:*图像的url是保存在核心数据与它关联的video。 该url是使用一个简单的转换方法生成的(generateThumbnailURL)

-(void)saveThumbnails{ NSManagedObjectContext *context = [self managedObjectContextThumbnails]; NSError *error; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Videos" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; NSLog(@"Videos: %i",fetchedObjects.count); if (fetchedObjects.count!=0) { for(Videos *currentVideo in fetchedObjects){ // Get an image from the URL below NSURL *thumbnailURL = [self generateThumbnailURL:[currentVideo.videoID intValue]]; UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:thumbnailURL]]; // Let's save the file into Document folder. // You can also change this to your desktop for testing. (eg /Users/kiichi/Desktop/) NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//Find Application's Document Directory NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"DownloadedThumbnails"]; // NSString *dataPath = @"/Users/macminidemo/Desktop/gt";//DEBUG SAVING IMAGE BY SAVING TO DESKTOP FOLDER //Check if Sub-directory exists, if not, try to create it if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath]){ NSError* error; if([[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]){ NSLog(@"New Folder Created!"); } else { NSLog(@"[%@] ERROR: attempting to write create new directory", [self class]); NSAssert( FALSE, @"Failed to create directory maybe out of disk space?"); } } NSArray *splitFilename = [[self generateThumbnailFilename:[currentVideo.videoID intValue]] componentsSeparatedByString:@"."];//Break Filename Extension Off (not always PNGs) NSString *subString = [splitFilename objectAtIndex:0]; NSString *formattedFilename = [NSString stringWithFormat:@"%@~ipad.png",subString]; NSString *localFilePath = [dataPath stringByAppendingPathComponent:formattedFilename]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; [imageData writeToFile:localFilePath atomically:YES]; NSLog(@"Image: %@ Saved!",formattedFilename); } } } 

我结束了使用这种方法来检测文件上的修改date:*发现在这里

 -(bool)isThumbnailModified:(NSURL *)thumbnailURL forFile:(NSString *)thumbnailFilePath{ // create a HTTP request to get the file information from the web server NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:thumbnailURL]; [request setHTTPMethod:@"HEAD"]; NSHTTPURLResponse* response; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; // get the last modified info from the HTTP header NSString* httpLastModified = nil; if ([response respondsToSelector:@selector(allHeaderFields)]) { httpLastModified = [[response allHeaderFields] objectForKey:@"Last-Modified"]; } // setup a date formatter to query the server file's modified date // don't ask me about this part of the code ... it works, that's all I know :) NSDateFormatter* df = [[NSDateFormatter alloc] init]; df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'"; df.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; // get the file attributes to retrieve the local file's modified date NSFileManager *fileManager = [NSFileManager defaultManager]; NSDictionary* fileAttributes = [fileManager attributesOfItemAtPath:thumbnailFilePath error:nil]; // test if the server file's date is later than the local file's date NSDate* serverFileDate = [df dateFromString:httpLastModified]; NSDate* localFileDate = [fileAttributes fileModificationDate]; NSLog(@"Local File Date: %@ Server File Date: %@",localFileDate,serverFileDate); //If file doesn't exist, download it if(localFileDate==nil){ return YES; } return ([localFileDate laterDate:serverFileDate] == serverFileDate); } 

如果你的服务器支持HTTPcaching,你可以使用NSURLRequestReloadRevalidatingCacheData指定你想caching的内容:

 NSURLRequest * request = [NSURLRequest requestWithURL:thumbnailURL cachePolicy:NSURLRequestReloadRevalidatingCacheData timeoutInterval:20];
 NSURLResponse *响应;
 NSError *错误;
 NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
 UIImage * image = [UIImage imageWithData:data];

有关更多信息,请阅读NSURLRequest文档 。