通过NSURLConnection sendAsynchronousRequest下载Ios表格单元格图像导致表格单元格删除崩溃

时间:2015-09-29 09:12:16

标签: ios uitableview nsurlconnection objective-c-blocks

我正在调用一个用于表格单元格图像下载的块。

[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队列中删除调用。

project log

1 个答案:

答案 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;
    }
    }];

更干净的解决方案是实现一个存储所有请求的控制器。如果你有这个,很容易取消它们。您不应该在UITableViewControllerUITableViewCell

中执行此操作