美文网首页
在子线程调用performSelector: withObjec

在子线程调用performSelector: withObjec

作者: 不丶是你的益达 | 来源:发表于2018-04-21 17:14 被阅读13次

    最近在项目中发现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: withObjec

          本文链接:https://www.haomeiwen.com/subject/rxnxlftx.html