2016-04-20 4 views
0

Мой таймер не останавливается, даже если я делаю «invalidate» и «nil» после прочтения других ссылок. Мой код, как показано ниже:NStimer не останавливается на invalidate

@property(nonatomic,strong) NSTimer *mytimer; 

- (void)viewDidLoad { 
[self performSelectorOnMainThread:@selector(updateProgressBar:) withObject:nil waitUntilDone:NO]; 
      <do some other work> 
} 

- (void) updateProgressBar :(NSTimer *)timer{ 
    static int count =0; 
    count++; 
    NSLog(@"count = %d",count); 
    if(count<=10) 
    { 
     self.DownloadProgressBar.progress= (float)count/10.0f; 
    } 
    else{ 
     NSLog(@"invalidating timer"); 
     [self.mytimer invalidate]; 
     self.mytimer = nil; 
     return; 
    } 
    if(count <= 10){ 
     NSLog(@"count = %d **",count); 
     self.mytimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateProgressBar:) userInfo:nil repeats:YES]; 

    } 
    } 

1) Таймер продолжает infinetly даже при недействительности таймер еще условие попал после того, как число> 10 и счетчик продолжает приращением.

2) Я хочу сделать это на основной теме. Я хочу продолжить в viewdidload() после запуска таймера. Как это сделать?

Я посетил другие ссылки на SO, все, что я понял, было вызвать invalidate и nil на указателе таймера. Я все еще сталкиваюсь с проблемами. Может ли кто-нибудь сказать мне, что я здесь отсутствует, и что я могу сделать, чтобы запустить updateProgressBar в фоновом потоке и обновить индикатор выполнения?

ответ

1

не нужно планировать таймер каждый раз, графика его один раз и таймер будет срабатывать каждый второй, например, и может сделать, как показано ниже,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self performSelectorOnMainThread:@selector(startTimerUpdate) withObject:nil waitUntilDone:NO]; //to start timer on main thread 
} 

//hear schedule the timer 
- (void)startTimerUpdate 
{ 
    self.mytimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateProgressBar:) userInfo:nil repeats:YES]; 
} 

- (void) updateProgressBar :(NSTimer *)timer{ 
    static int count =0; 
    count++; 
    NSLog(@"count = %d",count); 
    if(count<=10) 
    { 
     //self.DownloadProgressBar.progress= (float)count/10.0f; 
     NSLog(@"progress:%f",(float)count/10.0f); 
    } 
    else 
    { 
     NSLog(@"invalidating timer"); 
     [self.mytimer invalidate]; 
     self.mytimer = nil; 
     return; 
    } 
    if(count <= 10){ 
    NSLog(@"count = %d **",count); 
    } 
} 
+0

oops! Да, вы абсолютно правы. Пропустил эту часть. – CodeTry

+0

Просьба также предложить, как запустить таймер на фоне и обновить индикатор выполнения? – CodeTry

0

Я думаю, что вы планирование таймера несколько раз. Думаю, 10 раз. просто назначьте время один раз или, если потребуется много времени, затем сделайте недействительным его много раз в расписании.

Обновление согласно комментариям: Таймер расписания с viewdidload и addobserver означает уведомление о задаче. когда ваша задача завершится, недействительный таймер. и обновите свой прогресс в методе выбора таймера, поэтому, когда вы аннулируете его, он автоматически остановит индикатор выполнения.

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

Надеюсь, что это будет hellp :)

+0

oops !! я сожалею, пропустил эту часть !! – CodeTry

+0

Просьба также дать указание запланировать таймер в фоновом потоке и продолжить on viewdidload – CodeTry

+0

Проверить обновленный ответ – Lion

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