2015-10-16 2 views
0

СЦЕНАРИЙ Мне нужен способ, чтобы срабатывать каждую секунду. Я также должен иметь возможность остановить стрельбу метода в любое время. На данный момент я использую NSTimer:Objective-C: Лучшая практика для вызова метода каждую секунду

КОД

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

ВОПРОС Я уверен, что я могу достичь этой функции с помощью NSTimer и вызвать invalidate, когда я хочу, чтобы это остановить, однако Меня беспокоит выполнение служебных обязанностей при размещении NSTimer в UITableViewCell.

ВОПРОС Кто-нибудь знает более легкую альтернативу вызова метода каждую секунду?

+0

nstimer - единственный вариант, который мы получили !!! Выполнение не влияет на частоту вызова метода, но что делает ваш метод. До тех пор, пока вы правильно поддерживаете свой код в своем методе, вам не нужно беспокоиться о вызове его каждые 1 секунду. Я говорю это, потому что я называю свой метод каждые 0,1 секунды, и я вижу, что в анимации наблюдается значительное отставание. Но я думаю, что если это с 1 секундой, там не будет никаких проблем. –

+2

'NSTimer' в значительной степени легкий, как он может получить, сколько из этих таймеров вам нужно? Может быть, один таймер, который транслирует «NSNotification» каждую секунду, является лучшим решением? – JustSid

+4

Как правило, не стоит делать предположения о производительности кода, потому что мы, люди, ужасны в таких вещах. Реализуйте это и посмотрите. – dandan78

ответ

3

Я использовал 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 Механизмы

+0

Thuggish your awesome. –

2

NSTimer довольно легкий. Вам просто нужно убедиться, что вы правильно обрабатываете таймер Cell, когда ячейка повторно используется.

Смежные вопросы