Как приостановить и перезапустить NSTimer, когда вид исчезает? - PullRequest
2 голосов
/ 18 мая 2011

Я использую NSTimer в своем классе просмотра, который вызывается каждые 15 секунд.Моя проблема в том, что оно работает правильно, но мое приложение работает медленно, потому что оно показывает свою производительность всему приложению.Поэтому я хочу приостановить NSTimer, когда мой вид исчезнет из своего суперпредставления, и перезапустить таймер, когда он появится.Пожалуйста, помогите мне в решении проблемы.Вот мой код:

- (void) viewWillAppear:(BOOL)animated
{

    if(!Thread_bool)
    {
        //[spinner startAnimating];
        NSTimer *timer_new1=[[NSTimer alloc] init];
        timer_new1=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self                selector:@selector(threadMethod) userInfo:nil repeats:YES];
        self.timer_new=timer_new1;
        [timer_new1 release];
        [self.tableView setEditing:NO];
        isEditing=NO;
        Thread_bool=YES;    
    }
}

-(void)viewWillDisappear:(BOOL)animated
{
    [self.timer_new invalidate];
    timer_new=nil;  
}

Ответы [ 2 ]

8 голосов
/ 18 мая 2011
NSTimer *timer_new1=[[NSTimer alloc] init];
timer_new1=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(threadMethod) userInfo:nil repeats:YES];
self.timer_new=timer_new1;
[timer_new1 release];

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

NSTimer *timer_new1 = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(threadMethod) userInfo:nil repeats:YES];

И удалить [timer_new1 release]; (я предполагаю, что self.timer_new сохраняется). Также в viewWillDisappear сделать self.timer_new = nil; вместо timer_new=nil;. Добавив, что self вызовет сеттер и правильно отключит предыдущий таймер.

2 голосов
/ 18 мая 2011

У вас есть две строки, которые создают экземпляр NSTimer.Первый -

    NSTimer *timer_new1 = [[NSTimer alloc] init];

, а второй -

    timer_new1 = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(threadMethod) userInfo:nil repeats:YES];

Объект NSTimer, созданный первой строкой, сохраняется, о чем вы, похоже, знаете, потому что пытаетесьвыпустить это позже.Однако вторая строка выше создает новый экземпляр NSTimer, который является autoreleased .Когда вы делаете это, первый не выпущенный объект NSTimer просачивается!

Если вы установили свой метод доступа для timer_new, чтобы сохранить таймер, то удалите первую строку сверху и не выпуск timer_new1.

...