zoukankan      html  css  js  c++  java
  • NSTimer用法

    Timers的替代方法

    如果只是要延迟消息的发送,可以使用NSObject的方法

    - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

    + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget

    创建Timer的三种方法

    1.scheduling a timer with the current run loop 

    2.creating a timer that you later register with a run loop

    3.initializing a timer with a given fire date

     

    Scheduled Timers

    以下两个方法自动注册新创建的timer到当前NSRunLoop对象,NSRunLoop的模式为默认的NSDefaultRunLoopMode

    • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds invocation:(NSInvocation *)invocation repeats:(BOOL)repeats
    • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInforepeats:(BOOL)repeats
     
    只发送一次
    1. - (IBAction)startOneOffTimer:sender {  
    2.    
    3.     [NSTimer scheduledTimerWithTimeInterval:2.0  
    4.              target:self  
    5.              selector:@selector(targetMethod:)  
    6.              userInfo:[self userInfo]  
    7.              repeats:NO];  
    8. }  

     

    重复发送消息

    注:创建重复发送消息的timer一般需要保存一个引用,因为需要在某个时刻停止发送消息

    1. - (IBAction)startRepeatingTimer:sender {  
    2.    
    3.     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5  
    4.                               target:self selector:@selector(timerFireMethod:)  
    5.                               userInfo:[self userInfo] repeats:YES];  
    6.     self.repeatingTimer = timer;  
    7. }  



    Unscheduled Timers

    创建未注册的timer,使用时调用addTimer:forMode注册到NSRunLoop对象

    1. - (IBAction)createUnregisteredTimer:sender {  
    2.    
    3.     NSMethodSignature *methodSignature = [self methodSignatureForSelector:@selector(invocationMethod:)];  
    4.     NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];  
    5.     [invocation setTarget:self];  
    6.     [invocation setSelector:@selector(invocationMethod:)];  
    7.     NSDate *startDate = [NSDate date];  
    8.     [invocation setArgument:&startDate atIndex:2];  
    9.    
    10.     NSTimer *timer = [NSTimer timerWithTimeInterval:0.5 invocation:invocation repeats:YES];  
    11.     self.unregisteredTimer = timer;  
    12. }  
    1. - (IBAction)startUnregisteredTimer:sender {  
    2.     if (unregisteredTimer != nil) {  
    3.         NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
    4.         [runLoop addTimer:unregisteredTimer forMode:NSDefaultRunLoopMode];  
    5.     }  
    6. }  

     

    Initializing a Timer with a Fire Date

    创建一个拥有指定发送日期的timer

    1. - (IBAction)startFireDateTimer:sender {  
    2.     NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:1.0];  
    3.     NSTimer *timer = [[NSTimer alloc] initWithFireDate:fireDate  
    4.                                       interval:0.5  
    5.                                       target:self  
    6.                                       selector:@selector(countedtargetMethod:)  
    7.                                       userInfo:[self userInfo]  
    8.                                       repeats:YES];  
    9.    
    10.     timerCount = 1;  
    11.     NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
    12.     [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
    13.     [timer release];  
    14. }  

    Stopping a Timer

    1. - (IBAction)stopRepeatingTimer:sender {  
    2.     [repeatingTimer invalidate];  
    3.     self.repeatingTimer = nil;  
    4. }  
    5.    
    1. 也可以从timer发送的消息中停止timer  
    1. - (void)countedtargetMethod:(NSTimer*)theTimer {  
    2.    
    3.     NSDate *startDate = [[theTimer userInfo] objectForKey:@"StartDate"];  
    4.     NSLog(@"Timer started on %@; fire count %d", startDate, timerCount);  
    5.    
    6.     timerCount++;  
    7.     if (timerCount > 3) {  
    8.         [theTimer invalidate];  
    9.     }  
    10. }  



    Memory Management

    1. The run loop maintains the timer that is registered to it.

    2. The timer is passed as an argument when you specify its method as a selector

    3. You should maintain a strong reference to the unscheduled timer, in order to ensure that it's not deallocated before you use it.

    4. A timer maintains a strong reference to its user info dictionary,

    5. A timer maintains a strong reference to its target, so you should make sure that your timer's target survive longer than the timer itself.

  • 相关阅读:
    什么是字典序算法?
    安装使用zookeeper
    用最快速度将0*10范围内的数进行排序
    自定义schema 流程
    dubbo原理
    jvm 线上命令
    如何实现抢红包算法?
    GC Root 对象有哪些
    Jquery动态绑定事件处理函数 bind / on / delegate
    找出数组中的最小值(es5/es6)
  • 原文地址:https://www.cnblogs.com/lixiong-iOS/p/3559671.html
Copyright © 2011-2022 走看看