iOS - 使用 AFNetworking 获取图像保持缓存

Posted

技术标签:

【中文标题】iOS - 使用 AFNetworking 获取图像保持缓存【英文标题】:iOS - getting image with AFNetworking keeps cache 【发布时间】:2014-08-06 10:57:57 【问题描述】:

在我的应用程序中,我使用的是 RESTKit,所以我的 AFNetworking 版本不是最新的。我不确定如何检查它的版本。 我想从我的服务器下载一张图片,因为响应是 jpg 文件,所以我使用的是 AFNetworking。在第一次下载图像时,它运行良好。然后我删除服务器上的图像并上传一个具有相同名称的新图像。然后,如果我删除应用程序中的图像并重新下载它。在这种情况下,我仍然会得到第一次下载时的旧图片。

这是我的代码:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://myserver.com"]];
[client setAuthorizationHeaderWithUsername:name password:password];

[client getPath:[NSString stringWithFormat:@"profile-images/%@.jpg", user.name] parameters:@ success:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSLog(@"SUCCES");
        NSData *imageData = responseObject;
        self.tmpImage = [UIImage imageWithData:imageData];

     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        NSLog(@"FAIL");
        self.tmpImage = [UIImage imageNamed:@"myImage.png"];
    ];

在我看来,该应用“记住”了我在下载图像时向服务器发送的第一个请求。然后当我重新下载它时,它给了我旧照片。有人知道怎么解决吗?

【问题讨论】:

代码是否工作。 【参考方案1】:

我终于可以使用NSMutableURLRequest 来解决这个问题。创建请求时,我将cachePolicy 设置为NSURLRequestReloadIgnoringLocalCacheData。含义:request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

这里是向服务器发送请求的代码:

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://server.com"]];
[client setAuthorizationHeaderWithUsername:name password:password];

NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:[NSString stringWithFormat:@"profile-images/%@.jpg", user.name] parameters:nil];

request.timeoutInterval = 10;
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

AFImageRequestOperation *operation;
operation = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:^UIImage *(UIImage *image) 
        NSLog(@"block");
        return image;
 success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
        NSLog(@"SUCCES");
        self.tmpImage = image;
 failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) 
        NSLog(@"FAIL");
        self.tmpImage = [UIImage imageNamed:@"myImage.png"];
];

[operation start];

【讨论】:

【参考方案2】:

当您在服务器上上传图像时,首先将图像保存在每次相同名称的文档目录中。在代码图像中保存名称为@""Profile1.jpeg"

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info


    UIImage *img = [info objectForKey:UIImagePickerControllerOriginalImage];

    img = [self imageWithImage:img scaledToSize:CGSizeMake(70, 70)];

    [btn_Photo setImage:img forState:UIControlStateNormal];

    NSData *webData = UIImageJPEGRepresentation(img, 0.5);

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    self.savedImagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",@"Profile1.jpeg"]];

    [webData writeToFile:self.savedImagePath atomically:YES];

    [picker dismissViewControllerAnimated:YES completion:^

        //[[UIApplication sharedApplication] setStatusBarHidden:YES];

    ];

使用新的ANetworking上传图片如下代码New AFNetworking

AFHTTPRequestOperationManager *Manager = [AFHTTPRequestOperationManager manager];

[Manager POST:str_Submit parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
 

        NSURL *filePath_Profile_Logo = [NSURL fileURLWithPath:self.savedImagePath];
        [formData appendPartWithFileURL:filePath_Profile_Logo name:@"userfile" error:nil];

 
success:^(AFHTTPRequestOperation *operation, id responseObject)
 
     NSLog(@"Success");


 
failure:^(AFHTTPRequestOperation *operation, NSError *error)
 
     NSLog(@"Fail")
 ];

请在上传之前检查您的文档目录路径图像是否更改。 请

【讨论】:

我可以请求不使用缓存吗?我要下载最近更新的头像 您的个人资料图片也在缓存中,并使用文档目录路径使用它。 我希望我的第二次下载不使用缓存。有可能吗? 第二次没有得到。因为当从 iphone 中删除应用程序时,一切都清楚了。 对不起,我不明白你的回答。

以上是关于iOS - 使用 AFNetworking 获取图像保持缓存的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking ios xcode 获取 gmail 邮件列表

在 afnetworking iOS 中获取字符串响应

iOS 从带有 JSON 参数的 AFNetworking HTTP POST 方法获取 JSON 响应

iOS使用HTTPS之AFNetworking

iOS开发网络数据之AFNetworking使用

AFNetworking:从 Http 响应中获取 JSON 值