iOS延时执行测试

#import "Person.h"

@implementation Person

- (void)testLog {
    [self performSelector:@selector(logd) withObject:nil afterDelay:0];//1
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"c");
    });//2
    
    [self performSelector:@selector(logb)];//3
    
    NSLog(@"a");//4
}

- (void)logd {
    NSLog(@"d");
}

- (void)logb {
    NSLog(@"b");
}

@end

上面这段代码在OS命令行程序和iOS程序中运行结果完全不同
这是在OS命令行程序中结果
这是在iOS程序中运行结果

在iOS程序中运行结果的原理

  • performSelector:@selector(logb)
    知识点:告诉线程直接调用方法
  • -(void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
    知识点:这个方法是单线程的,也就是说只有当前调用此方法的函数执行完毕后,selector方法才会被调用。
  • dispatch_after能让我们添加进队列的任务延时执行,该函数并不是在指定时间后执行处理,而只是在指定时间追加处理到dispatch_queue

程序执行到//1的时候,系统会等待testlog全部执行完再延时0s执行logd方法;
执行到//2的时候,告诉主队列0s后添加logc任务到主队列;
执行到//3的时候,主线程直接执行logb方法,打印b;
执行到//4的时候,主线程直接打印a;
打印完a,将需要延时加入进队列的方法加进主队列,而(void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay需要等待当前函数testlog执行完才能调用,所以先加进队列的是logc,打印c;
打印完c,testlog函数全部执行完毕,执行logd方法,打印d。

如有错误,敬请指出。

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

推荐阅读更多精彩内容

  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,776评论 1 180
  • 你从来叫不醒一个装睡的人,但我可以。 楼上班级的下来领快递啦!你的快递到了!!! ——快递小哥 你永远无法唤醒一个...
    甲高高阅读 319评论 0 0
  • 嗯,我还记得去年的海边。 看着晚风吹起我至腰的长发,绿色的裙子凌凌起舞。 对面有朦胧亮起的浮...
    施周李李阅读 178评论 0 0
  • 我曾尝试过制定各种各样的计划——学习计划、锻炼健身计划以及做成某一件事的计划,但终究这些美好的计划却往往在它们孕...
    心向远方的孩子阅读 137评论 0 0