iOS中延迟执行和取消的几种方式

作者: 伯牙呀 | 来源:发表于2018-01-09 19:05 被阅读5278次

    公用延迟执行的方法:

    - (void)delayMethod {
        NSLog(@"delayMethodEnd");
    }
    

    方法一、performSelector 方法

    1、延迟执行
    /**
     *  延迟执行
     *
     *  @param aSelector  方法名称
     *  @param anArgument  要传递的参数,如果无参数,就设为nil
     *  @param delay  延迟的时间
     */
    - (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
    
    2、取消延迟执行

    下面两个方法都是类方法,不能用实例对象去调用,只能用 NSObject。

    /**
     *  取消延迟执行的某一方法
     *
     *  @param aTarget  一般填self
     *  @param aSelector  延迟执行的方法
     *  @param anArgument  设置延迟执行时填写的参数(必须和上面performSelector方法中的参数一样)
     */
    + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
    
    /**
     *  取消延迟执行的所有方法
     *
     *  @param aTarget  一般填self
     */
    + (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
    
    3、使用如下:
    [self performSelector:@selector(delayMethod) withObject:nil afterDelay:2.0];
    
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayMethod) object:nil];
    
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    

    方法二、NSTimer 定时器

    1、延迟执行
    + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
    
    2、取消延迟执行
    - (void)invalidate;
    
    3、使用如下:
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
    
    [timer invalidate];
    

    方法三、NSThread线程的sleep

    1、延迟执行
    + (void)sleepForTimeInterval:(NSTimeInterval)ti;
    

    注:此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。

    2、取消延迟执行

    sleep放入子线程,可以通过处理取消。

    3、使用如下:
    [NSThread sleepForTimeInterval:2.0];
    [self delayMethod];
    

    方法四、GCD

    1、延迟执行
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
    });
    
    2、取消延迟执行

    // to do

    3、使用如下:
    int64_t delayInSeconds = 10.0; // 延迟的时间
    
    /*
     *  delta:
     *
     *  @parameter 1.时间参照,从此刻开始计时
     *  @parameter 2.延时多久,此处为秒级,还有纳秒等: 10ull * NSEC_PER_MSEC
     */
    
    __weak typeof(self)weakSelf = self;
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [weakSelf delayMethod];
    });
    

    最后

    完整代码:

    - (void)allMethod {
        
        // 1.
        
        [self performSelector:@selector(delayMethod) withObject:nil afterDelay:2.0];
        
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayMethod) object:nil];
        
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
        
        // 2.
        
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
        
        [timer invalidate];
        
        // 3.
        
        [NSThread sleepForTimeInterval:2.0];
        
        [self delayMethod];
        
        // 4.
        
        int64_t delayInSeconds = 10.0; // 延迟的时间
        
        /*
         *  delta:
         *
         *  @parameter 1.时间参照,从此刻开始计时
         *  @parameter 2.延时多久,此处为秒级,还有纳秒等: 10ull * NSEC_PER_MSEC
         */
        
        __weak typeof(self)weakSelf = self;
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [weakSelf delayMethod];
        });
    }
    
    - (void)delayMethod {
        NSLog(@"delayMethodEnd");
    }
    

    相关文章

      网友评论

      本文标题:iOS中延迟执行和取消的几种方式

      本文链接:https://www.haomeiwen.com/subject/elibnxtx.html