使用服务器响应在UICollectionView中显示来自imageURL的图像

问题描述:

我想要做的是从imageUrlUICollectionView中渲染图像,该图像来自服务器作为响应。 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"}]}

+0

能否请您发送您的API响应? –

+0

plz检查,更新了问题。 –

+0

请检查我更新的答案,希望它的工作。 –

改变这一行从 NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:URL]; 到

NSURLRequest * urlRequest = [NSURLRequest requestWithURL:url]; 

其余看起来不错

+0

我认为它不会影响任何东西。 –

+0

休息看起来很好,当我遇到类似的问题时我做了这个,对我很好用 –

+0

如果可能是问题,我不会得到响应。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; 
} 

谢谢:)

+0

问题是控件不会去那个委托方法 –

+0

您可以请分享您的API响应或Image URL? –

+0

什么是'[NSURL URLWithString:imgUrl]'中的'imgUrl''我已经在't中附加'productImageUrl'他阵列。 –