performSelector afterDelay 区别 dispatch_after 及 其他

我们在.m文件里面加入如下方法

  • (void)viewDidLoad {
    [super viewDidLoad];
    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadRun) object:nil];
    [thread start];
    }

  • (void)threadRun
    {
    [self performSelector:@selector(delayTest) withObject:nil afterDelay:0.2]; //不会调用
    [self performSelector:@selector(noDelayTest) withObject:nil]; //会调用
    }

  • (void)delayTest
    {
    NSLog(@"this is delayTest");
    }

  • (void)noDelayTest
    {
    NSLog(@"this is noDelayTest");
    }

推荐阅读:iOS开发——2019 最新 BAT面试题合集(持续更新中)

我们发现,在0.2秒之后,delayTest方法并没有走,而如果我们没有使用afterDelay的noDelayTest 方法却直接调用了,这是为什么呢?

其实performSelector 方法相当于告诉当前线程去直接去调用noDelayTest方法,noDelayTest方法当然会被调用,

而performSelector afterDelay 相当于 告诉当前线程 用当前线程的定时器去调用delayTest方法,但是我们知道,在子线程中,默认是没有定时器的,所以delayTest方法将没有被调用的机会.

解决办法

使用dispatch_after代替performSelector afterDelay,具体如下

  • (void)threadRun
    {
    //会调用
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 0.2*NSEC_PER_SEC);
    dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self delayTest];
    });
    }

结论

1.performSelector 如果不使用延时,程序会再子线程上直接调用该方法,方法会被调用
2.如果使用延时,在子线程中方法不会被调用,因为该方法等待定时器去调用,而该子线程中没有定时器,所以不会调用
3.解决2的方法就是使用dispatch_after里面会有一个定时器,来调用方法

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

群内提供数据结构与算法、底层进阶、swift、逆向、整合面试题等免费资料
附上一份收集的各大厂面试题(附答案) ! 群文件直接获取
各大厂面试题

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 1,322评论 0 7
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    iOS菜鸟大大阅读 739评论 0 1
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    卑微的戏子阅读 641评论 0 1
  • performSelector和直接调用方法的区别performSelector: withObject:是在iO...
    woshishui1243阅读 366评论 0 3