gpt4 book ai didi

ios - 当它们离开屏幕时取消与 UITableViewCells 关联的 NSTimers

转载 作者:可可西里 更新时间:2023-11-01 04:21:34 24 4
gpt4 key购买 nike

我实现了 UIImageView 单元格的 UITableView,每个单元格通过 NSTimer 每 5 秒定期刷新一次。每个图像都在后台线程中从服务器加载,我还从该后台线程更新 UI,通过调用 performSelectorOnMainThread 显示新图像。到目前为止一切顺利。

我注意到的问题是线程数量随着时间的推移而增加,并且 UI 变得无响应。因此,如果单元格离开屏幕,我想使 NSTimer 无效。我应该使用 UITableView 中的哪些委托(delegate)方法来高效地执行此操作?

我之所以将 NSTimer 与每个单元格相关联,是因为我不希望所有单元格同时发生图像转换。顺便说一句,还有其他方法可以做到这一点吗?例如,是否可以只使用一个 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) {
}];
}

最佳答案

willMoveToSuperview: 和/或 didMoveToSuperview: 不适用于 ios 6.0

从 ios 6.0 开始,你有以下 UITableViewDelegate 方法

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

Use this method to detect when a cell is removed from a table view, as opposed to monitoring the view itself to see when it appears or disappears.

关于ios - 当它们离开屏幕时取消与 UITableViewCells 关联的 NSTimers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12242224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com