performSelector:withObject:afterDelay:实现原理

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
       dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:0];
        NSLog(@"2");
    });
}
-(void)test
{
    NSLog(@"3");
}

结果:
2019-09-30 11:45:59.590025+0800 测试 switch[38382:3031541] 1
2019-09-30 11:45:59.590292+0800 测试 switch[38382:3031541] 2

当调用 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。所以如果当前线程没有 RunLoop,则这个方法会失效。

'
屏幕快照 2019-10-12 上午9.46.26.png

屏幕快照 2019-10-12 上午9.51.07.png

你可能感兴趣的:(performSelector:withObject:afterDelay:实现原理)