1

バックグラウンドで画像をキャッシュするために 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:^{] から外に出ます。なぜそう、上記のために助けてください。here linkからアイデアを得ました。

4

1 に答える 1

0

を使用するデメリットはたくさんありNSOperationQueueます。そのうちの 1 つは、スクロールするたびに画像がフリックすることです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 には、UI をロックアップしないように iOS で非同期に画像を読み込んで表示するための UIImageView の単純なカテゴリと、より高度な機能のための UIImageView サブクラスの両方が含まれています。AsyncImageView は URL で動作するため、ローカル ファイルまたはリモート ファイルで使用できます。

ロード/ダウンロードされた画像はメモリにキャッシュされ、メモリ警告が発生した場合に自動的にクリーンアップされます。AsyncImageView は UIImage キャッシュとは独立して動作しますが、既定では、アプリケーション バンドルのルートにある画像はすべて UIImage キャッシュに格納され、キャッシュされた画像の重複が回避されます。

このライブラリを使用して、UIImageView とは無関係にイメージをロードおよびキャッシュすることもできます。これは、基になるロードおよびキャッシュ クラスへの直接アクセスを提供するためです。

于 2013-03-28T06:17:38.257 に答える