仅针对可见的单元格下载内容

时间:2014-01-29 13:37:51

标签: ios objective-c uicollectionview uicollectionviewcell sdwebimage

我有UICollectionViewCell动态内容下载(图片下载)。我已经在块中下载了单元格:

-(MainVCCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"MainVCCell";

    MainVCCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    Person *person = [self.fetchedResult objectAtIndex:indexPath.row];

    [cell.login setText:person.login];

    if(person.avatar) {
        [cell.avatarImageView setImage:[UIImage imageWithData:person.avatar]];
    } else {
        [cell.avatarImageView setImage:[UIImage imageNamed:@"placeholder"]];
        [AsyncUrl request:[NSString stringWithFormat:@"some SSL URL",person.login] completeBlock:^(NSData *data) {
            dispatch_queue_t downloadQueue = dispatch_queue_create("Download queue", NULL);
            dispatch_async(downloadQueue, ^{
                dispatch_async(dispatch_get_main_queue(), ^{
                    MainVCCell *cellToUpdate = (MainVCCell*)[collectionView cellForItemAtIndexPath:indexPath];
                    if(cellToUpdate) {
                        [cellToUpdate.avatarImageView setImage:[UIImage imageWithData:data]];
                    }
                    person.avatar = data;
                    [[CoreDataController sharedInstance] saveContext];
                });
            });
        } errorBlock:^(NSError *error) {
            NSLog(@"%@",error);
        }];

    }

    return cell;
}

它工作正常,但当我滚动几次,我得到这么多的连接和下载火,其中一些甚至超时。我明白为什么会这样。有没有办法取消隐形单元块中的连接?我只想下载一个可见的内容。

我熟悉SDWebImage,但此库不支持SSL连接,因此我无法使用它。

3 个答案:

答案 0 :(得分:0)

集合视图具有在单元格消失时调用的委托方法

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

请确保您有一个停止连接的方法,然后调用该方法。

UICollectionViewDelegate Protocol

答案 1 :(得分:0)

我强烈建议您使用AFNetworking

然后在viewDidLoad中创建一个NSOperation数组:

self.operationQueue = [[NSMultableArray alloc]init];

-(MainVCCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath中,制作与此类似的内容:

AFHTTPRequestOperation *operation [[AFHTTPRequestOperation alloc] initWithRequest:posterURLRequest];      
operation.responseSerializer = [AFImageResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) 
    {
        if(cellToUpdate) {
          [cellToUpdate.avatarImageView setImage:[UIImage imageWithData:data]];
        }
        person.avatar = data;
        [[CoreDataController sharedInstance] saveContext];             
    }
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
    {
      // manage errors
    }];
    [self.operationQueue addObject:operation];
    [operation start];

他们- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

[self.operationQueue[indexPath.row] cancel];

答案 2 :(得分:-2)

使用NSURLConnection开始下载。

创建一个NSObject的子类,它有一个NSUrlConnection实例属性,对于这个子类,你提供一个链接,它将使用NSUrlConnection下载图像。
如果要下载图像并将其推入数组(例如 ConnectionsArray ),请创建此类的实例。

如果您认为,您不想下载特定的indexPaths图像,只需使用ConnectionsArray取消它们。
使用indexPath和ConnectionsArray获取特定的download-instance,并调用该对象的NSURLConnection的cancel方法。

NSURLConnection具有取消方法,取消正在进行的操作。