2016-02-15 121 views
0
#pragma mark Collection View 
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 
    return 1; 
} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return [array count]; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 

    NSLog(@"indexpath row : %d", indexPath.row); 

    UILabel *label = (UILabel *)[cell viewWithTag:100]; 
    NSString *checkisfolder=[checkfolder objectAtIndex:indexPath.row]; 
    NSString *selectorValue=[list2 objectAtIndex:indexPath.row]; 

    NSURL *url = [NSURL URLWithString:[imgarray objectAtIndex:indexPath.row]]; 
    NSLog(@"indexpath image : %@", [imgarray objectAtIndex:indexPath.row]); 
    NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 

    // load image from JSON URL 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
         UIImageView *imgView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 140, 80)] autorelease]; 

         if (imgView != nil) { 
          NSLog(@"selectorValue1 : %@", selectorValue); 

          UIImage *img = [[UIImage alloc] initWithData:data]; 

          dispatch_async(dispatch_get_main_queue(), ^{ 
           UIButton *imageButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
           imageButton.frame = CGRectMake(15, 10, 257, 140); 
           [imageButton setImage:img forState:UIControlStateNormal]; 

           imageButton.tag=[selectorValue intValue]; 

           imageButton.adjustsImageWhenHighlighted = NO; 
           if([checkisfolder isEqual: @"isfolder"]){ 
            [imageButton addTarget:self action:@selector(imagefolderClicked:) forControlEvents:UIControlEventTouchUpInside]; 
           }else{ 
            [imageButton addTarget:self action:@selector(imageViewClicked:) forControlEvents:UIControlEventTouchUpInside]; 
           } 
           [cell addSubview:imageButton]; 

           UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(userLongPressed:)]; 

           press.minimumPressDuration = 1.0; 

           [imageButton addGestureRecognizer:press]; 
           [press release]; 
          }); 
         }; 
        }); 


    label.text = [array objectAtIndex:indexPath.row]; 
    label.lineBreakMode = NSLineBreakByWordWrapping; 
    label.numberOfLines = 0; 

    [cell.layer setBorderWidth:1.0f]; 
    [cell.layer setBorderColor:[UIColor whiteColor].CGColor]; 
    [cell.layer setCornerRadius:5.0f]; 

    return cell; 
} 

图像再次从服务器加载并使滚动向上或向下非常滞后。以下是发生这种情况的日志。UICollectionView图像一次又一次地在滚动中滞后加载

2016-02-15 10:53:55.273 Go Test[2086:651177] indexpath row : 0 
2016-02-15 10:53:55.274 Go Test[2086:651177] indexpath image : http://media.movideo.com/media-images-670/media/1358499/320x160.png 
2016-02-15 10:53:55.465 Go Test[2086:651298] selectorValue1 : 475 
2016-02-15 10:53:55.476 Go Test[2086:651177] indexpath row : 1 
2016-02-15 10:53:55.476 Go Test[2086:651177] indexpath image : http://media.movideo.com/media-images-670/media/1358500/320x160.png 
2016-02-15 10:53:55.534 Go Test[2086:651284] selectorValue1 : 476 
2016-02-15 10:53:55.541 Go Test[2086:651177] indexpath row : 2 
2016-02-15 10:53:55.542 Go Test[2086:651177] indexpath image : http://media.movideo.com/media-images-670/media/1358318/320x160.png 
2016-02-15 10:53:55.709 Go Test[2086:651283] selectorValue1 : 477 
2016-02-15 10:53:55.818 Go Test[2086:651177] there are 0 objects in the array 
2016-02-15 10:53:55.819 Go Test[2086:651177] there are 0 objects in the array 

如何解决滞后问题?应该只从服务器加载一次图像并保存在缓存或本地。

+0

我重写了代码。更改'[imageButton setImage:img forState:UIControlStateNormal];'到'[imageButton setImageWithURL:url forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@“logo.png”]];'。但我得到这个错误***终止应用程序由于未捕获异常'NSInvalidArgumentException',原因:' - [UIButton setImageWithURL:forState:placeholderImage:]:无法识别的选择器发送到实例0x155ecf00''。 – raymondkwan

回答

0

如果你希望缓存图像有一些伟大的和流行的第三方框架可用,您可以使用这样的:

他们可以缓存ANS解决滞后问题

SDWebImageAFNetworking 和你可以在github上找到一些其他更好的框架

如果你想手动维护它,你可以使用'NSCache',你可以在这里找到一些很好的教程net

+0

谢谢。我有一个'imgarray',它包含代码中的图像url数组。我该如何重写? – raymondkwan

+0

可以遍历在cellForItemAtIndexPath方法的图像的阵列与您选择像 为SDWebImage ImageView的方法就会像 '代码 NSURL * imgUrl的= [NSURL URLWithString:[imgarray objectAtIndex:indexPath.row]]; [ImageButton的sd_setImageWithURL:iurl placeholderImage:[UIImage的imageNamed:@ “”]];' 对于按钮: '代码[ImageButton的sd_setImageWithURL:imgUrl的forState:UIControlStateNormal placeholderImage:[UIImage的imageNamed:@ “”]]; ' 或者如果您在单个索引处有阵列您可以检查Sharavan的回复 – HardikDG

+0

Thx。我重写了代码。更改'[imageButton setImage:img forState:UIControlStateNormal];'到'[imageButton setImageWithURL:url forState:UIControlStateNormal placeholderImage:[UIImage imageNamed:@“logo.png”]];'。但我得到这个错误***终止应用程序由于未捕获异常'NSInvalidArgumentException',原因:' - [UIButton setImageWithURL:forState:placeholderImage:]:无法识别的选择器发送到实例0x155ecf00''。 – raymondkwan

1
  • 您可以使用SDWebimage来解决问题。
  • 另一种方式是使用dispatch_async/NS操作队列。
  • 但是,SDWebImage确实在内部使用上述方法之一。就存储图像而言,建议使用它。
  • U需要缓存图像。
+0

@Pyro谢谢!有没有教程如何重写代码?我已经下载了SDWebimage框架并添加了#import行“UIImageView + Webcache”。ħ 到myviewcontroller – raymondkwan

+0

类'#进口' 接着 '[self.Image sd_setImageWithURL:iurl placeholderImage:[UIImage的imageNamed:@ “”]];' – Shravan

+0

噢THX,但我有一个'imgarray'在代码中包含图像url数组。我应该如何重写? – raymondkwan

相关问题