我正在调用一个用于表格单元格图像下载的块。
[self downloadImageWithURL:aa completionBlock:^(BOOL succeeded, UIImage *image) {
if (succeeded) {
cell.imageView.image = image;
((DatabaseHelper *) [upcoming objectAtIndex:indexPath.row]).image = image;
}
}];
- (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, UIImage *image))completionBlock
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if ( !error )
{
UIImage *image = [[UIImage alloc] initWithData:data];
completionBlock(YES,image);
} else{
completionBlock(NO,nil);
}
}];
}
并且它工作得很好......但问题是,一旦对于任何单元格调用该块,如果我在AsynchronousRequest完成之前删除该单元格,则应用程序崩溃。 所以当我删除单元格时,如何从NSoperation队列中删除调用。
答案 0 :(得分:1)
因为我认为您的代码在这里崩溃:[upcoming objectAtIndex:indexPath.row]
。快速解决方法是检查您的阵列是否可用,如下所示:
[self downloadImageWithURL:aa completionBlock:^(BOOL succeeded, UIImage *image) {
if (succeeded && upcoming && [upcoming lenght] > indexPath.row) {
cell.imageView.image = image;
((DatabaseHelper *) [upcoming objectAtIndex:indexPath.row]).image = image;
}
}];
更干净的解决方案是实现一个存储所有请求的控制器。如果你有这个,很容易取消它们。您不应该在UITableViewController
或UITableViewCell
。