我在iOS应用程序中发现了最奇怪的行为。我有这个代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
CMLog(@"Start Save RoundQuestions Asynchronously");
[round saveRoundQuestions:target selector:selector];
});
该函数完成工作并调用此函数:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:selector];
#pragma clang diagnostic pop
日志显示一切正常运行,但是目标会在navigationController上调用pushViewController,这需要花费很多时间才能进行实际的推送。我可以通过单击“主页”按钮来强制其继续。我读过我可能违反了线程安全性,可能需要唤醒运行循环。
从dispatch_async调用选择器是否错误?还是我需要在UI所在的主线程上执行选择器?
编辑:我实际上想出了问题。事实证明,我正在调用一个函数,该函数阻塞了saveRoundQuestions内部的UI,我认为这可以将推送动画强制到行尾。我将此功能放在后台,推送动画现在立即发生。但是我仍然对为什么感到好奇?
最佳答案
您可以使用dispatch_async成功更新UI。只是不使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)
而是使用dispatch get_main_queue()
编辑:
根据您的更新。如果要在saveRoundQuestions
内执行一些昂贵的工作,然后在updateUI内执行,则应使用:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CMLog(@"Start Save RoundQuestions Asynchronously");
[round saveRoundQuestions:target selector:selector];
});
然后在
saveRoundQuestions
内部,在dispatch_get_main_queue()
中放置另一个块以更新UI。
关于objective-c - 我用选择器和目标调用dispatch_async。选择器被调用,但直到我单击主页按钮,界面才会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10141747/