[英]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.