5

セルを実装します。各セルは、UITableViewUIImageView介して5秒ごとに定期的に更新されますNSTimer。各画像はバックグラウンドスレッドのサーバーから読み込まれ、そのバックグラウンドスレッドから、を呼び出してUIを更新し、新しい画像を表示しperformSelectorOnMainThreadます。ここまでは順調ですね。

私が気付いた問題は、スレッドの数が時間の経過とともに増加し、UIが応答しなくなることです。NSTimerしたがって、セルが画面から消えた場合は無効にします。UITableViewこれを効率的に行うには、どの委任方法を使用する必要がありますか?

NSTimerすべてのセルで同時に画像遷移が発生することを望まないため、各セルにを関連付ける理由。ちなみにこれを行う他の方法はありますか?たとえば、1つだけを使用することは可能NSTimerですか?

SDWebImageサーバーからロードされたループ内の画像のセットを表示することが私の要件であるため、使用できません)

//MyViewController.m内

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        ...
        NSTimer* timer=[NSTimer scheduledTimerWithTimeInterval:ANIMATION_SCHEDULED_AT_TIME_INTERVAL 
                                                    target:self 
                                                  selector:@selector(updateImageInBackground:) 
                                                  userInfo:cell.imageView 
                                                   repeats:YES];
        ...
    }

- (void) updateImageInBackground:(NSTimer*)aTimer
{  
    [self performSelectorInBackground:@selector(updateImage:)
                       withObject:[aTimer userInfo]];
}  

- (void) updateImage:(AnimatedImageView*)animatedImageView 
{      
    @autoreleasepool { 
        [animatedImageView refresh];
    }
}  

//AnimatedImageView.m内

 -(void)refresh
    {
        if(self.currentIndex>=self.urls.count)
            self.currentIndex=0;

    ASIHTTPRequest *request=[[ASIHTTPRequest alloc] initWithURL:[self.urls objectAtIndex:self.currentIndex]];
    [request startSynchronous];

    UIImage *image = [UIImage imageWithData:[request responseData]];

    // How do I cancel this operation if I know that a user performs a scrolling action, therefore departing from this cell.
    [self performSelectorOnMainThread:@selector(performTransition:)
                       withObject:image
                    waitUntilDone:YES];
}

-(void)performTransition:(UIImage*)anImage
{
    [UIView transitionWithView:self duration:1.0 options:(UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowUserInteraction) animations:^{ 
        self.image=anImage;
        currentIndex++;
    } completion:^(BOOL finished) {
    }];
}
4

2 に答える 2

6

willMoveToSuperview:および/またはdidMoveToSuperview:iOS6.0では動作しません

iOS 6.0から、UITableViewDelegateの次のメソッドがあります

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

この方法を使用して、セルがテーブルビューから削除されたことを検出します。ビュー自体を監視して、セルが表示または非表示になるタイミングを確認するのではありません。

于 2013-09-17T09:09:18.553 に答える
5

メモリを適切に管理し、再利用可能なセルをデキューすると、タイマーを停止するためにUITableViewCellそのメソッドをサブクラス化してオーバーライドできます。- prepareForReuse

さらに、@ lnfazigerが指摘しているように、セルがテーブルビューから削除されたときにタイマーをすぐに停止したい場合は、そのメソッドwillMoveToSuperview:やメソッドをオーバーライドして、パラメーターが-であるかdidMoveToSuperview:どうかを確認することもできます。削除されたので、タイマーを停止できます。superviewnil

于 2012-09-03T07:50:31.430 に答える