NSTimer не останавливается

Вы можете использовать интерфейс RouteComponentProps, который объявляет все реквизиты, переданные withRouter:

import { RouteComponentProps } from 'react-router-dom';
..
interface ChildComponentProps extends RouteComponentProps<any> {
  /* other props for ChildComponent */
}
const ChildComponent : React.SFC<ChildComponentProps> = ({ history }) => (
  ..
);

Параметр type для RouteComponentProps является типом свойства params в match, поэтому он вам не понадобится, если вы не сопоставляете именованные сегменты пути.

В качестве альтернативы, если history не прибывает из withRouter, но пропущен сам как опора, вы можете импортировать тип из history:

import { History } from 'history';
..
interface ChildComponentProps {
  history : History
  /* other props for ChildComponent */
}
const ChildComponent : React.SFC<ChildComponentProps> = ({ history }) => (
  ..
);
22
задан Gilles 'SO- stop being evil' 20 March 2012 в 15:28
поделиться

5 ответов

Я должен был сохранить связь с таймером, сохранив ее. :) Я задал этот вопрос 5 месяцев назад, и удивительно, сколько еще опыта я приобрел. :)

timer = [ [NSTimer scheduledTimerWithTimeInterval: ...] retain];
...
...
[timer invalidate];
[timer release];
38
ответ дан 29 November 2019 в 03:48
поделиться

Вы забыли отпустить таймер в viewWillDisappear:

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [timer invalidate];
    [timer release];
    timer = nil;
}

Однако это не должно вызывать срабатывание таймера ...

0
ответ дан 29 November 2019 в 03:48
поделиться

Из сделать недействительным документ говорит

«Цикл выполнения удаляет и освобождает таймер либо непосредственно перед возвратом метода недействительности, либо позже. "

Я полагаю, ваш будет удален в какой-то момент.

0
ответ дан 29 November 2019 в 03:48
поделиться

Метод, вызываемый таймером, должен иметь определение

- (void)methodName:(NSTimer *)aTimer;

Таким образом метод имеет экземпляр таймера, который был запущен. Как вы это делаете, метод не будет знать, был ли таймер недействителен или нет.

Попробуйте изменить инициализацию таймера на

timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f target: self selector:@selector(timerAction:) userInfo:nil repeats:YES]

, а метод на

-(void) timerAction:(NSTimer *)aTimer{...}

Надеюсь, что это поможет

6
ответ дан 29 November 2019 в 03:48
поделиться

Возможно, это не проблема, но вам необходимо сохранить ссылку на таймер, возвращаемую из scheduleTimerWithInterval :. Без этого указатель на таймер может оказаться недействительным к тому моменту, когда вы остановите его.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    timer = [[NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES] retain];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [timer invalidate];
    [timer release];
    timer = nil;
    [super viewDidDisappear:animated];
}

- (void)dealloc
{
    [timer invalidate];
    [timer release];
    timer = nil;
    [super dealloc];
}

Также попробуйте установить точку останова в viewDidDisappear и убедитесь, что он вызывается!

2
ответ дан 29 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: