情景我需要一种方法来触发每一秒。我还需要能够随时停止触发该方法。目前我正在使用NSTimer
:
代码
self.controlTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updatePlayer) userInfo:nil repeats:YES];
问题我确信我可以使用NSTimer
来实现此功能,并在我希望它停止时调用invalidate
,但我担心的是性能开销将NSTimer
放在UITableViewCell中。
问题有没有人知道每秒调用一个方法的重量更轻?
答案 0 :(得分:3)
我在NSTimer
和UITableViewCell
自定义子类中使用了UICollectionViewCell
个实例来执行您正在执行的操作,但我创建了一个协议PLMMonitor
来提供-startMonitoring
我和我的单元格上的-stopMonitoring
合同开始/停止(参见:invalidate
)任何计时机制。
议定书
(显然协议名称前缀可以轻松更改)
@protocol PLMMonitor <NSObject>
@required
- (void)startMonitoring;
- (void)stopMonitoring;
@end
使用单元格可见性来控制计时器
如果符合协议(允许-startMonitoring
中的混合单元格),我可以利用-[UITableViewDataSource tableView:cellForRowAtIndexPath:]
或-[UICollectionViewDelegate collectionView:willDisplayCell:forItemAtIndexPath:]
在单元格上调用UITableView/UICollectionView
:
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell conformsToProtocol:@protocol(PLMMonitor)])
{
[(UICollectionViewCell<PLMMonitor> *)cell startMonitoring];
}
}
然后我使用-[UITableViewDelegate tableView:didEndDisplayingCell:forRowAtIndexPath:]
或-[UICollectionViewDelegate collectionView:didEndDisplayingCell:forItemAtIndexPath:]
在单元格上调用-stopMonitoring
,如果它符合协议(再次允许UITableView/UICollectionView
中的混合单元格):< / p>
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell conformsToProtocol:@protocol(PLMMonitor)])
{
[(UICollectionViewCell<PLMMonitor> *)cell stopMonitoring];
}
}
使用View Controller Visibility控制计时器
您还应该在符合协议的可见单元格上向-viewWillAppear
和-viewWillDisappear
添加代码到-startMonitoring
和-stopMonitoring
以确保定时器在不再可见时适当地开始/停止:
- (void)viewWillAppear
{
for (UICollectionViewCell *aCell in [self.collectionView visibleCells])
{
if ([aCell conformsToProtocol:@protocol(PLMMonitor)])
{
[(UICollectionViewCell<PLMMonitor> *)aCell startMonitoring];
}
}
}
- (void)viewWillDisappear
{
for (UICollectionViewCell *aCell in [self.collectionView visibleCells])
{
if ([aCell conformsToProtocol:@protocol(PLMMonitor)])
{
[(UICollectionViewCell<PLMMonitor> *)aCell stopMonitoring];
}
}
}
NSTimers的性能影响/能源使用
可以减少NSTimer
实例对电池续航时间等影响的一种方法是利用其tolerance
属性,允许iOS执行some power savings magic with them while sacrificing a strict firing interval。
备用定时器/触发机制
您可以使用Grand Central Dispatch&#39;(GCD)dispatch_after()
机制,但你将失去取消调用的能力。
另一个选择是使用-[NSObject
performSelector:withObject:afterDelay:]
方法和
伴随+[NSObject
cancelPreviousPerformRequestsWithTarget:selector:object:]
用于调度要调用的选择器并取消调用的方法
分别
答案 1 :(得分:2)
NSTimer非常轻巧。您需要确保在重复使用单元格时正确处理Cell的计时器。