2

ここに私の問題があります:

UITableViewcustom を含むがありUITableViewCellます。これらのそれぞれUITableViewCell( と呼ばれる) は、画像 URL を指すプロパティを持つオブジェクトにHomePicCell関連付けられています。Picセルが表示されるとすぐに、 を使用してこの画像のダウンロードを開始しますSDWebImage manager

すべてがスムーズに機能していますが、20 ~ 80 秒後に一部のスレッドが CPU を占有し始めます。このデバイスは、寒い冬の夜に最適なハンドヒーターになりますが、今はこの機能を飛ばしたいと思います!

この問題の原因を特定することはできません。メモリを占有するだけなので、保持ループが問題になるとは思いません。実験的な意見は本当に役に立ちます。

ホギングスレッド

これが私のコードです:

UITableView データソース

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString* cellIdentifier = [@"HomePicCell" stringByAppendingString:[Theme sharedTheme].currentTheme];
    HomePicCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell) {
        cell = [[HomePicCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    if(self.pics.count>0){
        Pic* pic = self.pics[indexPath.section];
        [cell configureWithPic:pic];
    }

    return cell;
}

HomePicCell (configureWithPic:)

- (void)configureWithPic:(Pic*)pic
{
    self.pic = pic;

    // Reinit UI
    [self.progressView setHidden:NO];
    [self.errorLabel setHidden:YES];
    [self.photoImageView setAlpha:0];
    [self.progressView setProgress:0];

    [self.pic downloadWithDelegate:self];
}

ピック

- (void) downloadWithDelegate:(id<PicDownloadDelegate>)delegate
{
    SDWebImageManager *manager = [SDWebImageManager sharedManager];

    [manager downloadWithURL:self.url options:0 progress:^(NSUInteger receivedSize, long long expectedSize) {

        if(expectedSize>0){
            float progress = [@(receivedSize) floatValue]/[@(expectedSize) floatValue];
            [delegate pic:self DownloadDidProgress:progress];
        }

    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {

        self.isGif = @(image.images.count>1);

        if(image){
            if(cacheType == SDImageCacheTypeNone){
                [delegate pic:self DownloadDidFinish:image fromCache:NO];
            }else{
                [delegate pic:self DownloadDidFinish:image fromCache:YES];
            }
        }else{
            [delegate pic:self DownloadFailWithError:error];
        }

    }];
}

HomePicCell (デリゲート メソッド)

- (void)pic:(Pic*)pic DownloadDidFinish:(UIImage *)image fromCache:(BOOL)fromCache
{
    if(![pic isEqual:self.pic]){
        return;
    }

    [self.progressView setHidden:YES];
    self.photoImageView.image = image;
    [self updateUI];
}

- (void)pic:(Pic*)pic DownloadFailWithError:(NSError *)error
{
    if(![pic isEqual:self.pic]){
        return;
    }
    [self.errorLabel setHidden:NO];
    [self.progressView setHidden:YES];
}

- (void)pic:(Pic*)pic DownloadDidProgress:(float)progress
{
    if(![pic isEqual:self.pic]){
        return;
    }
    [self.progressView setProgress:progress+.01f];
}

ありがとう !

4

1 に答える 1