NStimer不会因无效而停止

时间:2016-04-20 13:05:35

标签: ios objective-c grand-central-dispatch nstimer

我的计时器不会停止,即使我正在做"无效"和" nil"看完其他链接后。我的代码如下:

@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)即使在计数&gt; 10之后命中计时器其他条件无效并且计数继续递增时,计时器也会进行infinetly。

2)我想在非主线程上执行此操作。我想在启动计时器后继续在viewdidload()中。这该怎么做 ?

我访问了SO上的其他链接,我理解的是调用invalidate和nil on timer pointer。我仍然面临着问题。谁能告诉我我在这里缺少什么以及我可以做什么来在后台线程上运行updateProgressBar并更新进度条?

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:0)

我认为你是多次安排计时器。我想10次。只计划一次时间,或者如果需要很多时间,那么很多时候将其作为时间表无效。

根据评论更新:从viewdidload和addobserver安排计时器意味着对任务的通知。当你的任务完成无效计时器。并在计时器的选择器方法中更新你的进度,这样当你使它失效时它将自动停止进度条。

第二件事:在移动另一个视图控制器之前,你应该使计时器无效,因为这个对象仍然存在,直到无效。

希望这将是hellp:)