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

标签 objective-c ios ios5

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

相关文章:

objective-c - mkmapview 中注释引脚的自定义图像

objective-c - 什么时候通过 iOS/Objective-C 中的代码操作屏幕控件是安全的

ios - UIView 转换矩形 : - finding subview position two views deep

ios - 在 iOS 中从 UIAlertView 访问 UITableViewCell

ios - 如何在运行时检查 iMessage、群发消息是否开启?

iphone - 我需要将背景音乐添加到我的应用程序的主视图中

iphone - 将数据库直接加载到 CoreData

ios - NSString initWithContentsOfURL 问题

ios - 如何使用 iOS5 的 viewcontroller 创建通用 View ?

iphone - 如何在iOS中实现剧烈的Shake?