在带有ARC的ios5.0中,在我的rootviewcontroller中,我调用了应用程序委托所持有的安全管理器对象中的方法。在那种方法中,我将计时器设置如下
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self
selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
然而,这永远不会激发选择器即。 updateModel:永远不会被调用。可能有什么不对?如果不使用NStimer,还有另一种更有效的方法吗?
答案 0 :(得分:115)
也可能是一个线程问题:
如果
[NSThread isMainThread]
为false然后像这样启动计时器:
dispatch_async(dispatch_get_main_queue(), ^{
timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
})
答案 1 :(得分:13)
你似乎与你的计时器变量有点混淆。
您初始化一个新的计时器,但实际上并没有使用它。你想使用你初始化的计时器还是你想要的ApplicationDelegate.timer?
以下是两种可能的解决方案。
选项一(假设您有一个名为ApplicationDelegate的类实例,并且它具有计时器属性):
ApplicationDelegate.timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes];
选项二:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(updateModel:) userInfo:str repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
答案 2 :(得分:8)
我遇到了同样的问题,我在主队列中触发计时器来解决它:
[NSURLConnection sendAsynchronousRequest:request queue:_operationQueue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
[self loopUpUpdateStart];
}];
-(void)loopUpUpdateStart{
dispatch_async(dispatch_get_main_queue(), ^{
_loopTimerForUpRevision =
NSTimer scheduledTimerWithTimeInterval: kNetworkLoopIntervalUpRev
target: self
selector: @selector(myCoolMethod)
userInfo: nil
repeats: YES];
TRACE(@"Start Up updates");
});
}
答案 3 :(得分:7)
这一行有几个问题:
[[NSRunLoop currentRunLoop] addTimer:ApplicationDelegate.timer forMode:NSRunLoopCommonModes];
首先,它根本不需要。 -scheduledTimerWithTimeInterval:...
已将计时器添加到runloop。您无需再次添加它。
其次,局部变量timer
与属性ApplicationDelegate.timer
无关(此时可能是nil
)。
如果你正在与应用程序代表交谈,以至于你创建了一个名为ApplicationDelegate
(一个全局的宏?)的东西,你就是在谈论它太多了。应用程序委托是应用程序的委托;它有助于应用程序启动和停止以及响应系统事件。应用程序委托不是存储全局变量的地方。在任何情况下,计时器绝对不是你从另一个对象获取的东西。