2016-06-09 1 views
-1

У меня есть функция в одном из моих viewControllers, которые я выполняю каждые 10 секунд.IOS - Objective C - Как прекратить выполнение периодической функции при выходе из представления?

Я хочу, чтобы эта функция прекратила выполнение, когда я выхожу из представления.

Я попробовал этот мир кода:

-(void)viewWillDisappear:(BOOL)animated 
{ 
    NSError *error2; 
    if ([_managedObjectContext save:&error2] == NO) { 
     NSAssert(NO, @"Save should not fail\n%@", [error2 localizedDescription]); 
     abort(); 
    } 
    else 
     NSLog(@"Context Saved"); 



    [self stopTimer]; 
    NSLog(@"View will disappear now"); 
} 

Он основно вызывая метод StopTimer, который даст значение NULL для таймера.

- (void) stopTimer 
{ 
    [timer invalidate]; 
    timer = nil; 
} 

Моя проблема заключается в том, что моя функция продолжает выполняться, даже если я выхожу из своего представления. и никогда не останавливается. Как я могу это исправить?

EDIT:

Это функция называется моим NSTimer:

- (void) MyFunctionCalledByNSTimer 
{ 
    [timer invalidate]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:10.0f 
            target:self selector:@selector(Function1) userInfo:nil repeats:YES]; 

} 

Я заявляю о своем NSTimer в ом моего ViewController

NSTimer *timer; 

Если вам нужно больше миров кода просто спросите, и я отредактирую вопрос.

+0

'1)' Your 'viewWillDisappear:' не будет компилироваться, поскольку отсутствует '' '- пожалуйста, добавьте полный, правильный метод. '2)' Вы не вызываете '[super viewWillDisappear: animated];' - пожалуйста, добавьте это в свой метод. '3)' Пожалуйста, добавьте функцию, вызванную таймером, которая постоянно работает с вопросом. '4)' Пожалуйста, добавьте код, объявляющий таймер, и метод, который будет запущен. –

+1

можете ли вы добавить код для создания nstimer или где вы создали nstimer? –

+0

@RoboticCat нам не нужно вызывать супер viewWillDisappear, если мы не хотим его переопределить. Метод будет вызван, хотя мы не называем супер! –

ответ

0

Используйте этот код вызов StopTimer на главном потоке

-(void)viewWillDisappear:(BOOL)animated 
{ 
    NSError *error2; 
    if ([_managedObjectContext save:&error2] == NO) { 
     NSAssert(NO, @"Save should not fail\n%@", [error2 localizedDescription]); 
     abort(); 
    } 
    else 
     NSLog(@"Context Saved"); 


    dispatch_async(dispatch_get_main_queue(), ^{ 
    //Your main thread code goes in here 
    [self stopTimer];  
    }); 


    NSLog(@"View will disappear now"); 
} 

помните, что вы должны отправить ТЕРЯЕТСЯ сообщение из потока, на котором был установлен таймер. Если вы отправляете это сообщение из другого потока, источник входного сигнала, связанный с таймером, не может быть удален из цикла запуска, что может помешать правильному выводу потока.

+0

Я только что попробовал свой код, это не сработало для меня, поскольку функция все еще выполняется, даже если я вышел из своего представления. как вы думаете, правильно ли вызвать метод stoptimer в viewWillDisappear? потому что я видел в некоторых ответах на вопрос, похожий на мои люди, вызывающие stoptimer in viewDidDisappear – samouray

+0

, мы также можем запустить уведомление из предыдущего метода view view viewer viewer viewer viewer, – suthar

+0

также проверить, что ваш таймер имеет память или нет. – suthar

3

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

Таким образом, может быть изменение MyFunctionCalledByNSTimer как ниже будет решить вашу проблему:

- (void) MyFunctionCalledByNSTimer 
{ 
    if(!timer){ 

      timer = [NSTimer scheduledTimerWithTimeInterval:10.0f 
            target:self selector:@selector(Function1) userInfo:nil repeats:YES]; 
    } 

} 

Теперь только один опорный таймер будет там и [timer invalidate] аннулирует таймер.

+0

Это правильный ответ , Я вам большое спасибо – samouray

+0

приветствую:) @ samouray –

+0

Здравствуйте, извините, но я просто понял, что моя функция все еще выполняется даже после того, как я реализовал это решение. Теперь я смущен, вчера, похоже, он работал, и теперь это не так. Надеюсь, вы можете мне помочь, если вы хотите получить дополнительную информацию о моем коде, я доступен. – samouray

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