使用服务器响应在UICollectionView中显示来自imageURL的图像
我想要做的是从imageUrl
的UICollectionView
中渲染图像,该图像来自服务器作为响应。 UICollectionView
没有问题,因为我已经用hardcoded URL
进行了测试。当我尝试使用包含url
作为键值对的array
加载它时,问题就开始了。可能是,我不知道从哪里拨打method which is responsible for getting the response from the server
的确切位置。我完全按照应该的方式获取响应,并将其传递到数组中。在调试时,我可以看到after getting response control is not going back to execute the
UICollectionView委托方法to render
imageUrl`。这是我正在尝试的代码。使用服务器响应在UICollectionView中显示来自imageURL的图像
#import "ProductCollectionViewController.h"
#import "ProductCell.h"
#import "UIImageView+WebCache.h"
@interface ProductCollectionViewController()
{
NSMutableData *receivedData;
NSMutableArray *productList;
}
@end
@implementation ProductCollectionViewController
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
static NSString * const reuseIdentifier = @"Cell";
-(void)viewDidLoad
{
[super viewDidLoad];
[self getProductList];
}
#pragma mark <UICollectionViewDataSource>
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return productList.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
ProductCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
NSURL *url = [[productList objectAtIndex:indexPath.row]valueForKey:@"url"];
[cell.productImageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]];
return cell;
}
-(void)getProductList
{
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
NSURL * url = [NSURL URLWithString:@“http:xxxxxxxxx"];
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithRequest:urlRequest];
[dataTask resume];
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
NSLog(@"status code %li", httpResp.statusCode);
receivedData=nil;
receivedData=[[NSMutableData alloc] init];
[receivedData setLength:0];
completionHandler(NSURLSessionResponseAllow);
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
[receivedData appendData:data];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
if (error) {
// Handle error
}
else {
NSError *tempError;
NSDictionary* response=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&tempError];
NSLog(@"Response is :%@", response);
productList = [NSMutableArray new];
NSArray *rsBody = response [@"rsBody"];
for(NSDictionary *dict in rsBody)
{
[productList addObject:@{@“url":dict[@"productImageUrl"]}]
}
}
}
响应 {"rsBody": [{"productId":11, "productImageUrl":"http:xxxx"}, {"productId":9, "productImageUrl":"http:"xxxx"}]}
改变这一行从 NSMutableURLRequest * urlRequest = [NSMutableURLRequest
requestWithURL:URL]; 到
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:url];
其余看起来不错
我认为它不会影响任何东西。 –
休息看起来很好,当我遇到类似的问题时我做了这个,对我很好用 –
如果可能是问题,我不会得到响应。NSURLRequest和NSMutableURLRequest几乎是一样的。 –
请尝试以下代码。希望为你工作。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
ProductCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
NSURL *url = [NSURL URLWithString:[[productList objectAtIndex:indexPath.row]valueForKey:@"url"]];
[cell.productImageView sd_setImageWithURL:url
placeholderImage:[UIImage imageNamed:@"placeholder"] options:SDWebImageRefreshCached
completed:nil];
return cell;
}
谢谢:)
问题是控件不会去那个委托方法 –
您可以请分享您的API响应或Image URL? –
什么是'[NSURL URLWithString:imgUrl]'中的'imgUrl''我已经在't中附加'productImageUrl'他阵列。 –
能否请您发送您的API响应? –
plz检查,更新了问题。 –
请检查我更新的答案,希望它的工作。 –