- 最简洁的方法
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
}];
但这中方式不是很好,不是很建议使用。
网友评论