Я использовал NSTimer
экземпляров внутри из UITableViewCell
и UICollectionViewCell
собственных подклассов, чтобы делать то, что вы делаете, но я создал протокол PLMMonitor
для обеспечения -startMonitoring
и -stopMonitoring
контрактов на мои клетки для запуска/остановок (см: invalidate
) любых механизмы синхронизации ,
Протокол
(Очевидно, что префикс имени протокола может быть легко изменен)
@protocol PLMMonitor <NSObject>
@required
- (void)startMonitoring;
- (void)stopMonitoring;
@end
Использование Cell Visibility для управления таймеров
я мог бы использовать -[UITableViewDataSource tableView:cellForRowAtIndexPath:]
или -[UICollectionViewDelegate collectionView:willDisplayCell:forItemAtIndexPath:]
для вызова -startMonitoring
на ячейку, если она соответствует протоколу (допускает m ixed клетки в 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
):
- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell conformsToProtocol:@protocol(PLMMonitor)])
{
[(UICollectionViewCell<PLMMonitor> *)cell stopMonitoring];
}
}
Использование View Controller Видимость для управления таймерами
Вы также можете добавить код к -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.
Альтернативные Таймер/Trigger Механизмы
nstimer - единственный вариант, который мы получили !!! Выполнение не влияет на частоту вызова метода, но что делает ваш метод. До тех пор, пока вы правильно поддерживаете свой код в своем методе, вам не нужно беспокоиться о вызове его каждые 1 секунду. Я говорю это, потому что я называю свой метод каждые 0,1 секунды, и я вижу, что в анимации наблюдается значительное отставание. Но я думаю, что если это с 1 секундой, там не будет никаких проблем. –
'NSTimer' в значительной степени легкий, как он может получить, сколько из этих таймеров вам нужно? Может быть, один таймер, который транслирует «NSNotification» каждую секунду, является лучшим решением? – JustSid
Как правило, не стоит делать предположения о производительности кода, потому что мы, люди, ужасны в таких вещах. Реализуйте это и посмотрите. – dandan78