iOS实现延时的三种方法及区别注意

如果需要延时处理某件事情,比如从现在开始,延时3秒后执行某个方法,则我们可以通过

方法①:dispatch_after来实现

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就不会存在这个问题

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

推荐阅读更多精彩内容

  • 一、什么是runloop 字面意思是“消息循环、运行循环”。它不是线程,但它和线程息息相关。一般来讲,一个线程一次...
    WeiHing阅读 8,178评论 11 111
  • 线程、进程 1.iOS中的多线程操作、多线程方式? 2.多线程的优点和缺点分别是什么? 答:优点:1、将耗时较长的...
    丶逐渐阅读 1,410评论 0 8
  • 1、请看下面一段代码,请问访问a,b,c 3种类型变量的效率从高到低依次是 (B) A. cbaB. abcC. ...
    AlanGe阅读 4,970评论 0 7
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,042评论 0 12
  • 近日,闲暇时不再看美剧或欧美韩国电影,而是看起了大陆剧集。《军师联盟之虎啸龙吟》和《九州牧云记》,再加上一个大陆综...
    雨辰的世界阅读 405评论 0 0