0

当初、コア グラフィックスを使用して画像をセルに描画しようとしましたが、画像が非常に大きかったため、動作が遅くなりました。現在、セルで UIImageViews を使用して、各セルに 1 つの画像を表示しています。

画像をキャッシュしているため、各セルを初めて読み込んだ後、完全にスムーズにスクロールします。ただし、初めてロードするときは、少しラグがあります。

これはかなり一般的な質問であるため、お見せできることはあまりありませんが、これまでに画像をどのように読み込んでいるかをお見せできると思います。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        self.isReadyForImage = NO;

        NSString *generated = [Entry generateString];

        const char *cString = (const char*)[generated UTF8String];

        dispatch_queue_t queue = dispatch_queue_create(cString, NULL);
        dispatch_async(queue, ^{

            self.thumbnailButton = [[UIButton alloc] init];
            self.thumbnailButton.contentMode = UIViewContentModeCenter;
            self.thumbnailButton.layer.shadowColor = [[UIColor blackColor] CGColor];
            self.thumbnailButton.layer.shadowOffset = CGSizeMake(0, 2);
            self.thumbnailButton.layer.shadowOpacity = 0.2;
            self.thumbnailButton.layer.shadowRadius = 3;
            self.thumbnailButton.userInteractionEnabled = YES;

            dispatch_async(dispatch_get_main_queue(), ^{
                self.isReadyForImage = YES;

                if (self.imageToBecomeThumbnail != nil) {
                [self setupThumbnail];
                }
            });

        });
self.selectionStyle = UITableViewCellSelectionStyleNone;

    }
    return self;
}
-(void)resetShadowPath {
   self.thumbnailButton.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.thumbnailButton.bounds].CGPath;
}

-(void)setThumbnail:(UIImage *)image {

    self.imageToBecomeThumbnail = image;

    if (self.isReadyForImage == YES) {
        [self setupThumbnail];
    }
}

-(void)setupThumbnail {
    [self.thumbnailButton setImage:self.imageToBecomeThumbnail forState:UIControlStateNormal];

    self.thumbnailButton.frame = CGRectMake(0, IMAGE_SPACING, self.imageToBecomeThumbnail.size.width, self.imageToBecomeThumbnail.size.height);
    self.thumbnailButton.center = CGPointMake(self.bounds.size.width / 2, self.thumbnailButton.center.y);
    [self resetShadowPath];
    [self.thumbnailButton addTarget:self action:@selector(thumbnailPressed:) forControlEvents:UIControlEventTouchUpInside];

    if (self.thumbnailButton.superview == nil) {
        [self addSubview:self.thumbnailButton];
    }
}

補足: ディスパッチ キューの他の場所について言及しているわけではありません。それぞれに固有のものが必要であると言われたので、このランダム文字列ジェネレーター コードを破棄しました。一意である必要がありますか、それとも再度参照されないかどうかは問題ではありませんか?

4

1 に答える 1

0

スクロールとは別にキャッシュを埋めます。アプリケーションが起動するか、新しいデータが利用可能になったらすぐに、2番目のスレッドで欠落しているサムネイルの生成を開始します。

于 2012-05-29T12:49:44.590 に答える