Objective-C:每秒调用方法的最佳实践

时间:2015-10-16 16:54:42

标签: ios objective-c nstimer

情景我需要一种方法来触发每一秒。我还需要能够随时停止触发该方法。目前我正在使用NSTimer

代码

self.controlTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updatePlayer) userInfo:nil repeats:YES];

问题我确信我可以使用NSTimer来实现此功能,并在我希望它停止时调用invalidate,但我担心的是性能开销将NSTimer放在UITableViewCell中。

问题有没有人知道每秒调用一个方法的重量更轻?

2 个答案:

答案 0 :(得分:3)

我在NSTimerUITableViewCell自定义子类中使用了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

备用定时器/触发机制

答案 1 :(得分:2)

NSTimer非常轻巧。您需要确保在重复使用单元格时正确处理Cell的计时器。