dispatch_once使NSTimer无效

时间:2014-07-15 06:46:12

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

这是我的示例代码..我有定时器每秒触发功能"调用"。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(call:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"sdfsf",@"wsdf", nil] repeats:YES];


-(void)call :(NSTimer *)timer{
    NSLog(@"called outside %@",timer.userInfo);
   static dispatch_once_t myDisPatch;
    dispatch_once(&myDisPatch, ^{
        NSLog(@"called inside");
    });

}

我怀疑的是,当我们改变"静态dispatch_once_t myDisPatch"进入" dispatch_once_t myDisPatch"。然后计时器自动无效。它不会再次调用该功能。为什么当我从dispatch_once_t中删除static关键字时会发生这种情况?为什么它会停止计时器?提前谢谢。

2 个答案:

答案 0 :(得分:1)

static dispatch_once_t myDisPatch;
dispatch_once(&myDisPatch, ^{
    NSLog(@"called inside");
});

这是通常用于单身人士的代码,以确保它只执行一次。当您删除static时,它可以执行多次,这就是它的工作原理。你根本不应该使用它来重复计时器。

因此,对于静态,你会每秒看到“被叫外部”,但“被叫内部”只有一次。这并不意味着计时器停止了。

答案 1 :(得分:1)

代码没有停止你的计时器。相反,当你删除静态关键字时,它会阻塞等待陷阱中的主线程(它永远停留在这里)。

当您希望触发计时器时,单击调试器中的暂停,您将看到堆栈跟踪。

enter image description here

enter image description here

如果您不想使用静态调度令牌,请为其指定值0(不确定为什么您实际上还需要dispatch_once)

dispatch_once_t myDisPatch = 0;
dispatch_once(&myDisPatch, ^{
    NSLog(@"called inside");
});