在子线程调用performSelector: withObject: afterDelay 延时方法无效

最近在项目中发现performSelector: withObject: afterDelay延时操作有时是无效的,程序没有继续执行。经过代码的分析发现这种情况一般都是发现在子线程中,结合runloop大概分析是以下原因。

  • 代码分析
- (void)foo1 {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self performSelector:@selector(foo2) withObject:nil afterDelay:2];
    });
}
- (void)foo2 {
    NSLog(@"foo2");
}

在这种情况下程序是没有任何反应的,foo2并不会在延时之后执行。
我们先看下foo1,在该方法中首先创建一个异步执行的任务,这时会开辟一个子线程,在这个子线程中我们去做了一个延时的处理,但是这个延时是基于运行循环的,而在子线程的runloop默认是不开启的,需要手动去开启[[NSRunLoop currentRunLoop] run],所以在这种情况下延时操作是无效的。而在主线程runloop是默认开启的所以一般情况下用performSelector: withObject: afterDelay做延时处理并没有问题。

你可能感兴趣的:(在子线程调用performSelector: withObject: afterDelay 延时方法无效)