0

我正在下载图像,然后使用 UIImageView 显示它。使用这种方法,每次加载视图时都会下载图像。我将如何在本地存储它以避免不必要的服务器请求?

   [self requestData ] ;
   UIImage *userImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:userProfileImageUrl ]]] ;
   [self.profileImageView  setImage:userImage ] ;
4

4 回答 4

1

第一次,您必须将图像保存到NSDocumentsDirectory. 为此,您必须采用目录路径并像这样附加 imageName

 NSString * documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString * documentsPathAppend = [documentsPath stringByAppendingFormat:@"/%@",[userProfileImageUrl lastPathComponent]];

你必须用以下条件写图像

    if(![[NSFileManager defaultManager]fileExistsAtPath:documentsPathAppend])
    {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:userProfileImageUrl]]];
   [data writeToFile:documentsPathAppend atomically:YES];
    }

之后,您必须将此路径添加到您的本地存储中,例如核心数据。从下次开始,您必须检查核心数据中特定 URL 的图像是否存在。如果存在,则从核心数据中获取路径并显示如下

[self.profileImageView setImage:[UIImage imageWithContentsOfFile:imageEntity.imagePath]];
于 2013-11-11T12:18:16.587 回答
1

我建议使用像SDWebImage这样处理缓存和异步下载的库。

于 2013-11-11T12:15:44.607 回答
0

尝试此方法将 UIImage 存储在本地目录中..

- (void)addImage:(UIImage *)image toCacheWithIdentifier:(NSString *)identifier {

    NSString *folderPath = @"LOCAL DIRECTORY PATH ";
    if(![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:nil]) 
    {

        [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:YES attributes:nil error:nil];
    }

   NSString *fileName = [NSString stringWithFormat:@"%@.png",identifier];
   fileName = [folderPath stringByAppendingPathComponent:fileName];
   NSData *imageData = UIImagePNGRepresentation(image);
   [imageData writeToFile:fileName atomically:YES];
}

要从本地目录中检索图像,请尝试此方法...

- (UIImage *)imageFromCacheWithIdentifier:(NSString *)identifier 
{
     NSString *folderPath = @"LOCAL DIRECTORY PATH ";
     NSString *fileName = [NSString stringWithFormat:@"%@.png",identifier];
     fileName = [folderPath stringByAppendingPathComponent:fileName];

     if([UIImage imageWithContentsOfFile:fileName]) 
     {
         return [UIImage imageWithContentsOfFile:fileName];
     }
     return nil;
 }
于 2013-11-11T12:19:16.403 回答
0

另一种可行的方法是在官方文档中使用NSURLCache(另请参阅:了解缓存访问)。

HTTP 缓存正是为满足这一要求而发明的:RFC 2616中的 HTTP 缓存。

不幸的是,HTTP 缓存是一个高级主题,它的确切行为NSURLCache非常模糊。

于 2013-11-11T13:57:09.893 回答