最近在项目中发现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
做延时处理并没有问题。
网友评论