[英]How many times will a repeating NSTimer fire when an application is restored to foreground?
[英]iPhone - NSTimer not repeating after fire
我正在创建和触发一个NSTimer
:
ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(handleTimer:)
userInfo:nil
repeats:YES];
[ncTimer fire];
和
- (void)handleTimer:(NSTimer *)chkTimer {
// do stuff
}
我保留我的计时器:
@property (nonatomic, retain) NSTimer *ncTimer;
出于某种原因,计时器没有重复。 它只发射一次,以后再也不会发射。
-fire:
方法手动触发一次。 要启动和重复计时器,您必须使用[[NSRunLoop currentRunLoop] addTimer: forMode:]
将其添加到运行[[NSRunLoop currentRunLoop] addTimer: forMode:]
明白了
将计时器添加到mainRunLoop
使其正常工作😆😆😆
干得好:
目标 C:
self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
斯威夫特 2
var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode)
斯威夫特 3、4、5
var ncTimer = Timer(timeInterval: 2.0, target: self, selector: #selector(self.handleTimer), userInfo: nil, repeats: true)
RunLoop.main.add(ncTimer, forMode: RunLoop.Mode.default)
您不能只分配给您在标题中作为属性放置的计时器。 这应该有效:
self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
另外:fire 方法会不循环地触发计时器。 如果计时器不重复,则它无效。 在说 fire 的那一行之后,添加:
BOOL timerState = [ncTimer isValid];
NSLog(@"Timer Validity is: %@", timerState?@"YES":@"NO");
您还可以在此块中复制您的代码,这会在主线程中插入 Timer 的创建。
因此,代码将保留:
dispatch_async(dispatch_get_main_queue(), ^{
self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
});
分配给ncTimer
不会启动属性retain
功能。
假设声明在成员对象中,您需要执行以下操作:
self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]
我不知道为什么但 Timer.scheduledTimer 方法不起作用但 Timer.init 方法起作用。
self.timer = Timer.init(timeInterval: 10.0, repeats: true, block: { (timer) in
print("\n--------------------TIMER FIRED--------------\n")
self.checkForDownload()
})
RunLoop.main.add(self.timer!, forMode: RunLoopMode.defaultRunLoopMode)
您可以通过以下方式在Swift 中编写相同的内容而无需在主循环中运行:
ncTimer = Timer.scheduledTimer(timeInterval: 1.0,
target: self,
selector: #selector(self.handleTimer),
userInfo: nil,
repeats: true)
ncTimer.fire()
带闭包的 Swift 计时器:
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
// Do whatever
}
timer.fire()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.