imageDownloadingQueue不起作用

时间:2013-03-28 06:12:02

标签: iphone uitableview

我正在使用NSOperationQueue在后台缓存图像。 以下是代码:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"CellIdentifier";
UITableViewCell *cell;
cell = [self.mUpcomEventsTable dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

UIImageView *imgView;
UILabel *lblEventName;
UILabel *lblDate;
UILabel *lblTime;
if(self.mEventNameArr != NULL)
{
NSString *imageUrlString = [NSString stringWithFormat:@"%@", [self.mEventImageArr objectAtIndex:indexPath.row]];
UIImage *cachedImage = [self.imageCache objectForKey:imageUrlString];
    NSLog(@"cache:%@", self.imageCache);

    imgView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 80, 90)];

    lblEventName = [[UILabel alloc]initWithFrame:CGRectMake(90, 10, 200, 30)];
    lblEventName.text = [self.mEventNameArr objectAtIndex: indexPath.row];
    lblEventName.font = [UIFont fontWithName:@"Helvetica-Bold" size:18];
    lblDate = [[UILabel alloc]initWithFrame:CGRectMake(90, 50, 100, 30)];
    lblDate.text = [self.mEventDateArr objectAtIndex:indexPath.row];
    lblTime = [[UILabel alloc]initWithFrame:CGRectMake(190, 50, 100, 30)];
    lblTime.text = [self.mEventTimeArr objectAtIndex:indexPath.row];

    strEventName = lblEventName.text;
    strEventDate = lblDate.text;
    strEventTime = lblTime.text;

if (cachedImage)
{
    imgView.image = cachedImage;
}
else
{
    // you'll want to initialize the image with some blank image as a placeholder

    imgView.image = [UIImage imageNamed:@"Placeholder.png"];

    // now download in the image in the background
    NSLog(@"queue:%@",self.imageDownloadingQueue);
    [self.imageDownloadingQueue addOperationWithBlock:^{

        NSURL *imageUrl   = [NSURL URLWithString:imageUrlString];
        NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
        UIImage *image    = nil;
        if (imageData)
            image = [UIImage imageWithData:imageData];

        if (image)
        {

            [self.imageCache setObject:image forKey:imageUrlString];

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                UITableViewCell *updateCell = [tableView cellForRowAtIndexPath:indexPath];
                if (updateCell)
                    imgView.image = cachedImage;
            }];
        }
    }];
}
}
else cell.textLabel.text = @"No event";
[cell addSubview:imgView];
[cell addSubview:lblEventName];
[cell addSubview:lblDate];
[cell addSubview:lblTime];
return cell;
}

这不是这一行     [self.imageDownloadingQueue addOperationWithBlock:^ { 它离开了这个。为什么如此,请帮助以上。 从这里link获得想法。

1 个答案:

答案 0 :(得分:0)

使用NSOperationQueue有很多不利之处。其中之一是每次滚动UITableView时,您的图像都会弹出。

我建议您使用此AsyncImageView。我已经习惯了,它可以创造奇迹。要调用此API:

ASyncImage *img_EventImag = alloc with frame;
NSURL *url = yourPhotoPath;
[img_EventImage loadImageFromURL:photoPath];
[self.view addSubView:img_EventImage]; // In your case you'll add in your TableViewCell.

与使用UIImageView相同。简单,它可以为您完成大部分工作。 AsyncImageView包含UIImageView上的一个简单类别,用于在iOS上异步加载和显示图像,以便它们不会锁定UI,以及用于更高级功能的UIImageView子类。 AsyncImageView适用于URL,因此可以与本地或远程文件一起使用。

加载/下载的图像缓存在内存中,并在发生内存警告时自动清除。 AsyncImageView独立于UIImage缓存运行,但默认情况下,位于应用程序包根目录中的任何图像都将存储在UIImage缓存中,从而避免重复缓存图像。

该库还可以独立于UIImageView加载和缓存图像,因为它提供了对底层加载和缓存类的直接访问。