Ios table 通过 NSURLConnection sendAsynchronousRequest 下载的单元格图像导致 table 单元格删除时崩溃
Ios table cell image download by NSURLConnection sendAsynchronousRequest causes crash on table cell delete
我正在为 table 细胞图像下载调用块。
[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 队列中删除调用。
因为我认为您的代码在这里崩溃了:[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
.
中执行此操作
我正在为 table 细胞图像下载调用块。
[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 队列中删除调用。
因为我认为您的代码在这里崩溃了:[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
.