我有一个UITableView,我正试图用服务器上的照片和其他数据(例如照片评论)填充它。UITableView上的表单元格具有用setImageWithURL:placeHolderImage:
设置的UIImageView。问题是只显示占位符图像。
我已经对AFHTTPClient进行了子类化,并且我正在对服务器使用基本身份验证。所以,我正在做这样的事情:
[self setAuthorizationHeaderWithUsername:@"user" password:@"pass"];
当我对服务器执行GET请求时,我得到的是包含数据和图像路径的JSON。在tableView:cellForRowAtIndexPath:
方法中,我试图用setImageWithURL:placeHolderImage:
设置UIImageView,但每个下载图像的请求都返回401 Authorization Required。
我假设每个对图像URL的调用都不包括我在子类AFHTTPClient中拥有的基本身份验证信息。如果确实是这样的话,有没有办法让setImageWithURL:placeHolderImage:
使用包含基本身份验证信息的子类AFHTTPClient?或者,在每次下载图像的调用中,我可以采取其他方法来尊重这个基本身份验证吗?
虽然setImageWithURL:placeHolderImage:
是一种非常方便的方法,但您可能也需要使用一些变通方法来实现它。由于图像下载通常不需要身份验证,所以这并不奇怪。您可以更改UIImageView+AFNetworking.m
的代码。通过这种方式,您可以使用setAuthorizationHeaderWithUsername
方法对自己进行授权。
或者,您可以使用setImageWithURL:placeHolderImage:
在这里使用的底层方法,并使用AFImageRequestOperation
创建自己的类似类,在其中可以设置适当的授权头。如果选择此选项,请确保实现类似的缓存方法,以使一切尽可能高效。
在AFHTTPClient类的构造函数中添加以下内容:
[self registerHTTPOperationClass:[AFImageRequestOperation class]];
接下来,实现这样一个方法:
- (void) getImageAtPath:(NSString *)path
{
NSMutableURLRequest * request = [self requestWithMethod:@"GET" path:path parameters:nil] ;
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
AFHTTPRequestOperation * operation =
[self HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
[buffer setData:[operation responseData]];
NSLog( @"Got image data with length %d" , [buffer length] ) ;
// todo : use image raw data to populate image view
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog( @"unable to get data at %@ from the server %@" , path, [error localizedDescription] ) ;
}] ;
[operation start];
}