簡體   English   中英

iPhone - NSTimer 在火災后不重復

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM