IOS中的几种比较常见的延时方法的介绍及各自优缺点

- (void)delayMethod { NSLog(@"execute"); }
1.performSelector方法
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];
具体代码:
- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_main_queue(), ^{
    [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1];
    });
;
    NSLog(@"ccdvvv");
}
-(void)delayMethod{
    NSLog(@"第一种延时函数");
}
运行结果: 2016-03-03 11:33:47.612 延时函数的使用[2004:92977] ccdvvv
         2016-03-03 11:33:47.620 延时函数的使用[2004:92977] 第一种延时函数
         我们可以看到无论怎么设置延时时间,ccdvvv总是先于delayMethod打印出来,这个跟Block方法的调用机制有关。这种方式的延时只是针对这个方法本身的函数而言的。

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

2.定时器:NSTimer

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
具体代码:
- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
    NSLog(@"1");
}
-(void)delayMethod{
    NSLog(@"2");
}
运行结果:
2016-03-03 11:41:12.738 延时函数的使用[2036:97927] 1
2016-03-03 11:41:13.742 延时函数的使用[2036:97927] 2
这种方式的延时也只是针对这个方法本身的函数而言的。

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
可以通过NSTimer类的- (void)invalidate;取消执行。

  1. sleep方式
[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];
具体代码:
- (void)viewDidLoad {
    [super viewDidLoad];
    [NSThread sleepForTimeInterval:2];
    [self delayMethod];
    NSLog(@"1");
}
-(void)delayMethod{
    NSLog(@"2");
}
运行结果:
2016-03-03 11:43:12.568 延时函数的使用[2066:99923] 2
2016-03-03 11:43:12.568 延时函数的使用[2066:99923] 1
这个函数可以实现延时,可以延时多少时间再去执行某一个函数,也就是让程序处于类似于休眠状态,时间到了自动 去执行下面的方法。

此方式在主线程和子线程中均可执行。
是一种阻塞的执行方式,建方放到子线程中,以免卡住界面
没有找到取消执行的方法。

4.GCD方式

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self delayMethod];
    });
       NSLog(@"1");
}
-(void)delayMethod{
    NSLog(@"2");
}
运行结果:
2016-03-03 11:48:33.244 延时函数的使用[2098:103294] 1 2016-03-03 11:48:35.437 延时函数的使用[2098:103294] 2

此方式在可以在参数中选择执行的线程。
是一种非阻塞的执行方式,
没有找到取消执行的方法。

你可能感兴趣的:(延时)