亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

主隊列上的performSelectorOnMainThread和dispatch_async

主隊列上的performSelectorOnMainThread和dispatch_async

白衣非少年 2019-12-26 14:06:19
我在修改線程內的視圖時遇到問題。我試圖添加一個子視圖,但是顯示大約需要6秒鐘或更長時間。我終于使它工作了,但我不知道它到底是怎么做到的。所以我想知道為什么它起作用以及以下方法之間的區別是什么://this worked -added the view instantlydispatch_async(dispatch_get_main_queue(), ^{    //some UI methods ej    [view addSubview: otherView];}//this took around 6 or more seconds to display[viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView waitUntilDone:NO];//Also didnt work: NSNotification methods -  took also around 6 seconds to display//the observer was in the viewController I wanted to modify//paired to a method to add a subview.[[NSNotificationCenter defaultCenter] postNotificationName: @"notification-identifier" object:object];作為參考,在ACAccountStore類的完成處理程序內部調用了該方法。accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {            if(granted) {            //my methods were here            }}編輯:當我說它不起作用時,我的意思是花了大約6秒鐘才能顯示我添加的視圖。
查看完整描述

3 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

默認情況下,-performSelectorOnMainThread:withObject:waitUntilDone:僅計劃選擇器以默認運行循環模式運行。如果運行循環處于另一種模式(例如跟蹤模式),則在運行循環切換回默認模式之前它不會運行。您可以使用該變體來解決此問題-performSelectorOnMainThread:withObject:waitUntilDone:modes:(通過傳遞您希望它在其中運行的所有模式)。

另一方面,dispatch_async(dispatch_get_main_queue(), ^{ ... })一旦主運行循環將控制流返回到事件循環,就會運行該塊。它不在乎模式。因此,如果您也不想關心任何模式,dispatch_async()可能是更好的選擇。


查看完整回答
反對 回復 2019-12-26
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

可能是因為performSelectorOnMainThread:withObject:waitUntilDone:使用常見的運行循環模式將消息排隊。根據Apple的《并發編程指南》,主隊列將把排隊的任務與應用程序運行循環中的其他事件進行交錯。因此,如果事件隊列中還有其他事件要處理,則調度隊列中的已排隊塊可以先運行,即使它們是稍后提交的。


本文是performSelectorOnMainThreadvs. 的出色解釋dispatch_async,它也回答了上述問題。


查看完整回答
反對 回復 2019-12-26
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

你試試PerformSelectorOnMainThread用waitUntilDone=YES


例如:


碼:


[viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView waitUntilDone:YES];

我認為這可能會解決問題,因為為什么PerformSelectorOnMainThread需要這么長時間才能做出回應。


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 1005 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號