gpt4 book ai didi

objective-c - 我用选择器和目标调用dispatch_async。选择器被调用,但直到我单击主页按钮,界面才会更新

转载 作者:行者123 更新时间:2023-12-01 18:00:52 25 4
gpt4 key购买 nike

我在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com