3 回答

TA貢獻1856條經驗 獲得超5個贊
默認情況下,-performSelectorOnMainThread:withObject:waitUntilDone:
僅計劃選擇器以默認運行循環模式運行。如果運行循環處于另一種模式(例如跟蹤模式),則在運行循環切換回默認模式之前它不會運行。您可以使用該變體來解決此問題-performSelectorOnMainThread:withObject:waitUntilDone:modes:
(通過傳遞您希望它在其中運行的所有模式)。
另一方面,dispatch_async(dispatch_get_main_queue(), ^{ ... })
一旦主運行循環將控制流返回到事件循環,就會運行該塊。它不在乎模式。因此,如果您也不想關心任何模式,dispatch_async()
可能是更好的選擇。

TA貢獻1863條經驗 獲得超2個贊
可能是因為performSelectorOnMainThread:withObject:waitUntilDone:使用常見的運行循環模式將消息排隊。根據Apple的《并發編程指南》,主隊列將把排隊的任務與應用程序運行循環中的其他事件進行交錯。因此,如果事件隊列中還有其他事件要處理,則調度隊列中的已排隊塊可以先運行,即使它們是稍后提交的。
本文是performSelectorOnMainThreadvs. 的出色解釋dispatch_async,它也回答了上述問題。

TA貢獻1818條經驗 獲得超3個贊
你試試PerformSelectorOnMainThread用waitUntilDone=YES
例如:
碼:
[viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView waitUntilDone:YES];
我認為這可能會解決問題,因為為什么PerformSelectorOnMainThread需要這么長時間才能做出回應。
- 3 回答
- 0 關注
- 1005 瀏覽
添加回答
舉報