[iOS]淺談在子線程中使用PresentViewController

今天在面試的時(shí)候遇到個(gè)新手傲醉,談到線程的時(shí)候,他說他經(jīng)常在子線程進(jìn)行頁面跳轉(zhuǎn)乌助,代碼類似如下這段,頁面A按了按鈕后跳轉(zhuǎn)頁面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:,并且成功進(jìn)行了頁面跳轉(zhuǎn)仆葡。
一般在子線程跳轉(zhuǎn)頁面代碼會(huì)出現(xiàn)頁面延遲加載赏参,這是因?yàn)樵谧泳€程結(jié)束后主線程實(shí)現(xiàn)了子線程函數(shù)棧的原因,所以第一次遇到這居然能成功及時(shí)跳轉(zhuǎn)還挺吃驚浙芙。經(jīng)驗(yàn)告訴我登刺,這段presentViewController:animated:completion:雖然寫在子線程里,但是真正進(jìn)行頁面跳轉(zhuǎn)的應(yīng)該還是在主線程中嗡呼。
為了驗(yàn)證這個(gè)想法纸俭,給這段代碼加上日志。

    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]);
        }];
    });

不出所料南窗,得出的結(jié)果驗(yàn)證了我的想法揍很,確實(shí)進(jìn)入了主線程。

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

那么為什么presentViewController:animated:completion:可以在子線程中跳轉(zhuǎn)呢万伤?我用clang轉(zhuǎn)化成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的模態(tài)試圖跳轉(zhuǎn)是通過消息傳遞的,所以猜測presentViewController:animated:completion:的方式跳轉(zhuǎn)界面虹钮,可能在底層就是主線程執(zhí)行回調(diào)的聋庵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芙粱,隨后出現(xiàn)的幾起案子祭玉,更是在濱河造成了極大的恐慌,老刑警劉巖春畔,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脱货,死亡現(xiàn)場離奇詭異,居然都是意外死亡律姨,警方通過查閱死者的電腦和手機(jī)振峻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來择份,“玉大人扣孟,你說我怎么就攤上這事』貉停” “怎么了哈打?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵塔逃,是天一觀的道長。 經(jīng)常有香客問我料仗,道長湾盗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任立轧,我火速辦了婚禮格粪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氛改。我一直安慰自己帐萎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布胜卤。 她就那樣靜靜地躺著疆导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葛躏。 梳的紋絲不亂的頭發(fā)上澈段,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音舰攒,去河邊找鬼败富。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摩窃,可吹牛的內(nèi)容都是我干的兽叮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼猾愿,長吁一口氣:“原來是場噩夢啊……” “哼鹦聪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匪蟀,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤椎麦,失蹤者是張志新(化名)和其女友劉穎宰僧,沒想到半個(gè)月后材彪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琴儿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年段化,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片造成。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡显熏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晒屎,到底是詐尸還是另有隱情喘蟆,我是刑警寧澤缓升,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蕴轨,受9級特大地震影響港谊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橙弱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一歧寺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棘脐,春花似錦斜筐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屈梁,卻和暖如春蕴潦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俘闯。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工潭苞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人真朗。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓此疹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遮婶。 傳聞我的和親對象是個(gè)殘疾皇子蝗碎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • iOS多線程實(shí)踐中,常用的就是子線程執(zhí)行耗時(shí)操作旗扑,然后回到主線程刷新UI蹦骑。在iOS中每個(gè)進(jìn)程啟動(dòng)后都會(huì)建立一個(gè)主線...
    jackyshan閱讀 1,447評論 2 12
  • 一、前言 本篇博文介紹的是iOS中常用的幾個(gè)多線程技術(shù): NSThread GCD NSOperation 由于a...
    和玨貓閱讀 577評論 0 1
  • 周末晚餐的氣氛很愉快臀防,X先生請客眠菇,一桌4帥哥+5美女的組合。 喝白酒的先生們都很盡興袱衷,其中W先生感覺久旱逢甘霖一樣...
    吳佟閱讀 243評論 0 0
  • 突然清醒的早上捎废,心里有點(diǎn)慌 桌上沒看完的書 還有內(nèi)心躁動(dòng)的欲望 推窗而進(jìn)的清涼 樹葉開始枯黃 豐收的季節(jié),我發(fā)現(xiàn)自...
    白夜梧桐閱讀 217評論 3 1
  • 登青城山: 西蜀名山屬青城致燥, 道家問仙不問名登疗, 世人皆醉難獨(dú)醒, 且上青城嗅清風(fēng)。
    云之憾閱讀 339評論 0 0