IPhone - NSTimer не повторяется после пожара
Я создаю и запускаю 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;
По какой-то причине таймер не повторяется. Он стреляет только один раз и никогда больше.
Ответы
Ответ 1
Вы не можете просто назначить таймер, который вы поместили как свойство в свой заголовок. Это должно работать:
self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
Также: метод пожара запускает таймер, вне цикла. Если таймер не повторяется, он недействителен. После строки, которая говорит огонь, добавьте следующее:
BOOL timerState = [ncTimer isValid];
NSLog(@"Timer Validity is: %@", [email protected]"YES":@"NO");
Ответ 2
Метод -fire:
вручную запускает его один раз. Для запуска и повторения таймера вы должны добавить его в runloop с помощью [[NSRunLoop currentRunLoop] addTimer: forMode:]
Ответ 3
Понял
Добавление таймера к mainRunLoop
сделало его работоспособным 😆😆😆
Вот, пожалуйста:
Цель C:
self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
Swift 2
var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode)
Swift 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)
Ответ 4
Вы также можете скопировать код внутри этого блока, который вставляет создание таймера в основной поток.
Поэтому код останется:
dispatch_async(dispatch_get_main_queue(), ^{
self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];
});
Ответ 5
Присвоение ncTimer
, поскольку у вас нет функций retain
.
Предполагая, что объявление находится внутри объекта-члена, вам нужно будет:
self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]
Ответ 6
Я не знаю почему, но метод 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)