我有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连接,因此我无法使用它。
答案 0 :(得分:0)
集合视图具有在单元格消失时调用的委托方法
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
请确保您有一个停止连接的方法,然后调用该方法。
答案 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具有取消方法,取消正在进行的操作。