0

-drawRectUITableViewを代わりに高速化する試みで初めて使用しています。ただし、このdrawRect方法ではテーブルの速度が大幅に低下しているようです。

drawRectテーブルを高速化するために、以下の方法を改善する方法を教えてください。

編集 - -

drawRect メソッドでは、2 つの NSString をセルのビューに書き込み、2 つの UIImage と 1 つのドロップ シャドウを NSString の両方と UIImage の 1 つに書き込みます。

前述の画像の 1 つが非同期的にダウンロードsetNeedsDisplayされ、その UIImage を画面に描画するために呼び出されます。これが最初にラグが発生した理由である可能性があると思います。

- (void) drawRect:(CGRect) rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    [[UIColor clearColor] set];

    CGContextFillRect(context, rect);

    CGContextSaveGState(context);
    CGContextSetShadow(context, CGSizeMake(1,1),1);
    //draw text here

    if (shouldDrawImage == YES) {

        CGContextDrawImage(context, CGRectMake(10, 10, 40, 40), self.image.CGImage);

    }

    CGContextDrawImage(context, CGRectMake(self.frame.size.width - 16, 0, 16, self.frame.size.height), [UIImage imageNamed:@"right_bar_including_holes"].CGImage);

    NSString *authorName = [[self.info objectForKey:@"user"] objectForKey:@"full_name"];

    [RGB(219, 240, 73) set];

    CGSize maximumLabelSize = CGSizeMake(self.frame.size.width - 10 - 55 - 16,9999);
    CGSize authorsize = [authorName sizeWithFont:[UIFont boldSystemFontOfSize:15]
                                     constrainedToSize:maximumLabelSize 
                                         lineBreakMode:UILineBreakModeWordWrap]; 
    [authorName drawInRect:CGRectMake(60, 10, self.frame.size.width - 60, authorsize.height) withFont:[UIFont boldSystemFontOfSize:15]];

    [RGB(249,249,249) set];

    NSString *description = [self.info objectForKey:@"description"];
    CGSize descriptionSize = [description sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap];

    [description drawInRect:CGRectMake(60, authorsize.height + 15, descriptionSize.width, descriptionSize.height) withFont:[UIFont systemFontOfSize:14]];

    CGContextRestoreGState(context);

}

- (NSString *) reuseIdentifier {
    return NSStringFromClass([SlideCell class]);
}

- (void) updateCellInfo:(NSDictionary *)_info {
    [self setInfo:_info];

    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
    [iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[self.info objectForKey:@"user"] objectForKey:@"avatar"]]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *_image) {
        dispatch_async(dispatch_get_main_queue(), ^{
            shouldDrawImage = YES;
            self.image = [self roundedImage:_image];
            [iv release];
            [self setNeedsDisplay];
        });

    } failure:nil];

    [self setNeedsDisplay];

    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}
4

3 に答える 3

2

はい。Instruments の Time Profile をアプリで実行して、費やされた時間と場所を正確に知ることができます。それが画像、文字列、影、またはその他のものであるかどうかがわかります。

于 2012-06-15T21:41:55.283 に答える
1

ストック UITableView は、適切に使用すれば、可能な限り効率的です。 1. セルをリサイクルします (デキュー) 2. 可能な限り透過性を避けます (アルファ ブレンディングは速度を低下させます) 3. 再利用されたセルの構成には、多くの処理時間がかかりません。

drawRect をオーバーライドすることで Apple のコードを大幅に改善できる人はいないと思います...

于 2012-06-16T07:26:01.753 に答える
1

そのコードをプロファイリングして、最初に画像に問題があるかどうかを確認する必要があります。

画像を非同期でダウンロードするときに、AFNetworking ライブラリ (使用している) がどのように機能するかわかりません。

画像が問題であることがわかっている場合は、設定時に UIImageView で画像を再スケーリングする必要があると思われます。それが問題かもしれません。自動再スケーリングがトリガーされないように、UIImageView に設定する UIImage を UIIImageView のフレームに再スケーリングする必要があります。スクロールするとコストがかかります。

画像を受け取り、すぐにコードをメイン スレッドにディスパッチします。潜在的な再スケーリングは、「ボンネットの下」で機能する可能性があります。その方法を次のように変更します。

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, IMGSIZEX, IMGSIZEY)];
    [iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[self.info objectForKey:@"user"] objectForKey:@"avatar"]]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *_image) {
        //Note you have to implement rescaleToFitSize
        UIImage* rescaled = [_image rescaleToFitSize:iv.frame.size];
        dispatch_async(dispatch_get_main_queue(), ^{
            self.image = _image;
            [iv release];
            [self setNeedsDisplay];
        });

    } failure:^{
         //Handle failure! You create mem. leak on failure
         [iv release];
}];

補足として、イメージのダウンロードの失敗は処理しません。あなたは間違いなくすべきです。

于 2012-06-16T06:15:51.527 に答える