セルを実装します。各セルは、UITableView
をUIImageView
介して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) {
}];
}