[iOS]浅谈在子线程中使用PresentViewController

今天在面试的时候遇到个新手,谈到线程的时候,他说他经常在子线程进行页面跳转,代码类似如下这段,页面A按了按钮后跳转页面B。

   dispatch_async(dispatch_get_global_queue(0, 0), ^{
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        BViewController *bV = [sb instantiateViewControllerWithIdentifier:@"vb"];
        [self presentViewController:bV animated:NO completion:^{
        }];
    });

嗯,在子线程中使用presentViewController:animated:completion:,并且成功进行了页面跳转。
一般在子线程跳转页面代码会出现页面延迟加载,这是因为在子线程结束后主线程实现了子线程函数栈的原因,所以第一次遇到这居然能成功及时跳转还挺吃惊。经验告诉我,这段presentViewController:animated:completion:虽然写在子线程里,但是真正进行页面跳转的应该还是在主线程中。
为了验证这个想法,给这段代码加上日志。

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"queue 1 currentThread:%@",[NSThread currentThread]);
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        BViewController *bV = [sb instantiateViewControllerWithIdentifier:@"vb"];
        [self presentViewController:bV animated:NO completion:^{
            NSLog(@"queue 2 currentThread %@", [NSThread currentThread]);
        }];
    });

不出所料,得出的结果验证了我的想法,确实进入了主线程。

queue 1 currentThread:<NSThread: 0x60400026ff40>{number = 3, name = (null)}
queue 2 currentthread <NSThread: 0x600000066740>{number = 1, name = main}

那么为什么presentViewController:animated:completion:可以在子线程中跳转呢?我用clang转化成C/C++代码,看看Runtime是不是可以暴露原因。

static void _I_ViewController_transitionView_(ViewController * self, SEL _cmd, id sender) {

    dispatch_async(dispatch_get_global_queue(0, 0), ((void (*)())&__ViewController__transitionView__block_impl_1(
(void *)__ViewController__transitionView__block_func_1, &__ViewController__transitionView__block_desc_1_DATA, self, 570425344)));

}

emmmm.....完全看不出原因,看来iOS底层隐藏了。
iOS的模态试图跳转是通过消息传递的,所以猜测presentViewController:animated:completion:的方式跳转界面,可能在底层就是主线程执行回调的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI。在iOS中每个进程启动后都会建立一个主线...
    jackyshan阅读 5,379评论 2 12
  • 一、前言 本篇博文介绍的是iOS中常用的几个多线程技术: NSThread GCD NSOperation 由于a...
    和珏猫阅读 3,701评论 0 1
  • 周末晚餐的气氛很愉快,X先生请客,一桌4帅哥+5美女的组合。 喝白酒的先生们都很尽兴,其中W先生感觉久旱逢甘霖一样...
    吴佟阅读 1,774评论 0 0
  • 突然清醒的早上,心里有点慌 桌上没看完的书 还有内心躁动的欲望 推窗而进的清凉 树叶开始枯黄 丰收的季节,我发现自...
    白夜梧桐阅读 1,688评论 3 1
  • 我大多时候不太喜欢用电脑画画,因为颈椎会疼,可是人又比较懒,又要准备速写本,又要到处找笔,铅笔可能笔头已经粗...
    麦芽么么阅读 8,442评论 18 20

友情链接更多精彩内容