iOS延时实现方法 dispatch_after的使用

如果需要延时处理某件事情,则我们可以通过dispatch_after来实现,

比如从现在开始,延时3秒后执行某个方法:

dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC); 

dispatch_after(timer, dispatch_get_main_queue(), ^{


[self doSomething];

});

上面是用gcd实现的延时,除了gcd之外,还可以通过NSObject的分类方法:

[self performSelector:@selector(doSomething) withObject:self afterDelay:2];

和NSTimer的类方法:

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(doSomething) userInfo:nil repeats:NO];

它们在主线程上的执行效果是一样的。

那它们有什么区别,以及在使用的过程中要注意什么?

答案是在主线程上它们是一样的,当然nstimer的循环引用要注意。

在子线程上的话,使用NSObject的分类方法和NSTimer的类方法就得注意了!它们的实现是基于runloop的(runloop相当于消息循环,里面是一个while的死循环,不断的获取事件,分发事件,每个线程都有runloop,但是默认只有主线程开启,所以主线程不会退出,而子线程执行完任务就会退出),如果子线程没有激活runloop那着两个方法都不会执行演示!但是一半情况下我们不会激活子线程的runloop,因为我们并不详让子线程长驻内存。而gcd的dispatch_after就不会存在这个问题。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,789评论 8 265
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,388评论 0 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,172评论 1 32
  • iOS刨根问底-深入理解RunLoop 2017-05-08 10:35 by KenshinCui 概述 Run...
    mengjz阅读 1,589评论 1 10
  • 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时也是很多常见技术的幕后功臣。尽管在平时多...
    阳明AI阅读 1,124评论 0 17