2013-07-26 3 views
0

Скажите, что вы присоединяете таймер к runloop в определенном потоке, но поток вышел до запуска таймера, в результате чего метод не будет выполнен. Возможно ли это для этого сценария?Возможно ли, чтобы вызов с задержкой никогда не вызывался в потоке?

+1

@MarcusAdams Таймер запускается при следующем проходе через цикл событий, если истекло необходимое время. Он никогда не задержится до следующего раза. – bbum

+0

@bbum, я думал о повторении таймеров. События таймера можно пропустить, если они слишком задерживаются. Я удалил свой комментарий. Под «задержкой вызова» мы, вероятно, не говорим о повторении таймеров. :) –

+0

@MarcusAdams Ah .. ОК. Мое недоразумение. – bbum

ответ

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

Да, это так. Это происходит довольно легко, если есть таймер, но приложение закрывается «преждевременно». В этом случае дата срабатывания таймера будет потеряна - даже когда приложение будет перезапущено до того, как ранее была установлена ​​дата пожара таймера.