ios中延时执行延时(睡眠)的几种方法

  • 最简洁的方法
sleep(5);

该方法阻塞的是当前线程
sleep(0)可能不会被执行,而sleep(1)会被执行。这里引自sleep(1)和sleep(0)d区别。

此方式要求必须在主线程中执行,否则无效。是一种非阻塞的执行方式,暂时未找到取消执行的方法。

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

下面两个方法都是类方法,不能用实例对象去调用,只能用 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;

  • 用NSTread
[NSThread sleepForTimeInterval:5];

这中方式在主线程和子线程中均可执行,是一种阻塞式的执行方式,所以在这里建议放到子线程中执行,以防止界面卡住,暂时没有找到取消执行的方法。

  • 用GCD
NSLog(@"开始。。。。");
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            
            NSLog(@"结束。。。。");
        });

此方式是可以在参数中选择执行的线程,是一种非阻塞的执行方式。

  • NSTimer
延时执行
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
取消延时执行
- (void)invalidate;

注该方法是一种阻塞执行方法,建议放在子线程中执行,否则会卡住界面。但也有例外如:启动APP进入欢迎界面一般就需要沉睡几秒才进入主界面。

  • 用animation的completion参数
[UIView animateWithDuration:0.0 delay:5.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
    } completion:^(BOOL finished) {
        //do stuff here
    }];

但这中方式不是很好,不是很建议使用。

你可能感兴趣的:(ios中延时执行延时(睡眠)的几种方法)