Скажите, что вы присоединяете таймер к runloop в определенном потоке, но поток вышел до запуска таймера, в результате чего метод не будет выполнен. Возможно ли это для этого сценария?Возможно ли, чтобы вызов с задержкой никогда не вызывался в потоке?
0
A
ответ
3
Конечно, это возможно, и его достаточно просто продемонстрировать.
#import <Foundation/Foundation.h>
#define TIMER_INTERVAL 2.0
@interface Needle : NSObject
- (void)sew;
- (void)tick:(NSTimer *)tim;
@end
@implementation Needle
{
NSTimer * tim;
}
- (void)sew
{
@autoreleasepool{
tim = [NSTimer scheduledTimerWithTimeInterval:TIMER_INTERVAL
target:self
selector:@selector(tick:)
userInfo:nil
repeats:NO];
while(![[NSThread currentThread] isCancelled]){
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}
}
}
- (void)tick:(NSTimer *)timer
{
NSLog(@"Let's get the bacon delivered!");
[[NSThread currentThread] cancel];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Needle * needle = [Needle new];
NSThread * thread = [[NSThread alloc] initWithTarget:needle
selector:@selector(sew)
object:nil];
[thread start];
// Change this to "+ 1" to see the timer fire.
NSTimeInterval interval = TIMER_INTERVAL - 1;
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:interval]];
[thread cancel];
}
return 0;
}
+0
+1 для иллюстрации кода. – Boon
0
Да, если вы не находитесь на главной нити, нет NSRunLoop
, сохраняя нить живым и для таймеров. Вам нужно будет создать его и запустить.
0
Да, это так. Это происходит довольно легко, если есть таймер, но приложение закрывается «преждевременно». В этом случае дата срабатывания таймера будет потеряна - даже когда приложение будет перезапущено до того, как ранее была установлена дата пожара таймера.
@MarcusAdams Таймер запускается при следующем проходе через цикл событий, если истекло необходимое время. Он никогда не задержится до следующего раза. – bbum
@bbum, я думал о повторении таймеров. События таймера можно пропустить, если они слишком задерживаются. Я удалил свой комментарий. Под «задержкой вызова» мы, вероятно, не говорим о повторении таймеров. :) –
@MarcusAdams Ah .. ОК. Мое недоразумение. – bbum