当 Cocoa 应用程序中的主线程被阻塞时,UI 不会更新

2024-01-09

当我运行整个方法时,我在主线程中使用 NSProgressIndicator 来更新进度。现在,当我最终从不同的类文件调用一个对象,并等待该对象返回到我的主线程的值时,我注意到 NSProgressIndicator 将消失。我明白这是因为主线程被阻塞,直到我从另一个对象获得返回值。

所以我的问题是,在主线程中更新 UI 而不阻塞 UI 并让其他对象在后台运行并根据需要将值返回到主线程的推荐方法是什么。我知道如何使用块,但块操作不允许返回值。 我需要的是有助于这个伪代码的东西:

-(IBAction) main {

//Update progress indicator UI to show progress
//perform an call to another object from another class.
// wait till i get its return value.
//Update progress indicator UI to show progress
// Use this return value to do something.
//Update progress indicator UI to show progress


}

当调用另一个对象时,我注意到由于主线程被阻塞,我所确定的 NSProgressIndicator 完全消失了。谢谢。


您上面的代码不是正确的方法。自从main永远不会返回,进度指示器永远不会更新。您必须快速返回主线程。

相反,您想要做的是设置一个后台块,在不同的点更新主线程上的进度指示器。因此,例如:

- (IBAction)start:(id)sender {
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

  dispatch_async(queue, ^{
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:0];});

    // Doing some stuff
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:.25];});

    // Doing more stuff
    dispatch_async(dispatch_get_main_queue(), ^{[self.progress setProgress:.75];});
  });
}

(是的,这会导致队列保留self,但这里没问题,因为self不保留队列。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Cocoa 应用程序中的主线程被阻塞时,UI 不会更新 的相关文章

  • Java Thread.sleep() 实现

    有人可以帮我理解 Thread sleep 函数是如何实现的吗 当指定时间过去或其他线程中断时 线程恢复 唤醒 我有兴趣了解其工作背后的设计模式 据说睡眠对CPU消耗没有影响 当前线程是否已添加到侦听器列表中 什么时候检查中断标志 调度程序
  • 如何获取线程执行完成事件

    我正在创建一个新线程来调用其中的函数 Thread th new Thread My Function th start 我想在这个线程执行完成后做一些事情 有什么办法可以做到这一点吗 至少有两种可能的解决方案 后台工作者 Use a Ba
  • 互斥体没有正确使用?延续过去的问题

    我有第二个问题是该线程的延续 Windows 如何为线程选择内存 https stackoverflow com questions 30487064 how does windows pick memory for threads voi
  • 转发 UIAlertView 的可变参数

    我正在尝试设置一个非常简单的UIAlertView带有文本编辑 确定和取消按钮 我想根据文本编辑的内容禁用确定按钮 为了能够保留委托 以便他不会在警报视图之前消失 从而在用户对警报视图执行某些操作时立即导致崩溃 我对其进行了子类化 现在 我
  • 如何将非并行junit参数化测试转变为并行运行

    我编写了一个参数化的junit测试 有没有任何内置方法可以使其并行运行 任何 annoation例如 如果没有 我唯一的方法就是手动编写 你会如何管理junit java中的线程池 图书馆JUnit工具箱 https github com
  • iPhone 应用程序中的 iOS 7 状态栏恢复为 iOS 6 默认样式?

    在 iOS 7 中UIStatusBar它的设计方式是与视图合并 如下所示 GUI designed by Tina Tav ar http dribbble com shots 1183911 Side menu and status b
  • 新的自动引用计数机制如何工作?

    有人可以简单地向我解释一下 ARC 的工作原理吗 我知道它与垃圾收集不同 但我只是想知道它到底是如何工作的 另外 如果 ARC 的作用与 GC 的作用相同且不影响性能 那么 Java 为什么要使用 GC 为什么它不使用 ARC 呢 每个接触
  • 管理 iOS 中的布局

    我是新来的iOS开发方面 我对 JAVA Swing 和 Windows 应用程序有扎实的背景 我想学习如何进行布局iOS 我猜iOS没有 布局管理器 就像 Java Swing 中的那样 发展的唯一出路UI是否指定每个控制器的尺寸和位置
  • 在 wkwebview 中启用摄像头和麦克风访问

    我有一个针对移动设备优化的网络应用程序 它利用getUserMedia访问网络摄像头和麦克风资源 我正在将这个应用程序包装在WKWebView因为我想提供原生应用程序体验 我知道 iOS 不允许通过浏览器访问相机 但是有什么方法可以使用本机
  • UIPopViewController 不工作

    我有一个 xib 文件 其中有 h 和 m 链接 在 xib 中有一个带有 textView 的 UIView 我想要对该视图执行的操作是 当您单击按钮时将其作为 UIPopViewController 打开 这是我的代码 IBAction
  • 使用deleteRowsAtIndexPaths后indexPath未更新

    我创建了一个方法 当用户想要删除单元格时更新我的 UITableView void removeMoreFriendsRow NSNotification notification NSDictionary d notification u
  • 如何在 UIImagePickerController 捕获图像的瞬间获取当前位置?

    我研究了如何从返回的图像中获取位置数据UIImagePickerController相机 但是 我认为最简单的方法是获取当前位置CLLocationManager此刻UIImagePickerController捕获图像 有办法做到这一点吗
  • 是否可以在 Objective-C 中创建自定义指令?

    Objective C 有如下指令 界面 执行 end 协议 财产 合成 我认为这些东西就像复杂的宏或代码生成器 是否可以创建用于代码生成目的的自定义指令 一种可能的用途是为 CoreData 生成方法 我想不是 因为我从来没有见过任何东西
  • Oracle sqlldr是否并行处理多个INFILE

    我正在使用 sqlldr 将数据加载到 Oracle RAC 在 Linux 上 并且我正在尝试提高数据加载的性能 我正在使用 直接路径 并且为 sqlldr 设置了 parallel true 而且 由于我的服务器是多核的 所以默认情况下
  • 如果没有解析器生成器,如何用 C 或 Objective-C 编写解析器?

    我正在尝试用 C 或 Objective C 制作一个计算器 它接受以下字符串 8 2 4 3 9 2 并返回答案 2920 我不想使用像 Lex 或 Yacc 这样的生成器 所以我想从头开始编码 我该怎么做呢 除了 龙 这本书之外 还有其
  • 我应该在哪里保存想要长期保留的数据和文件,以及如何防止 iCloud 备份它们

    我有任意类型的文件 包括核心数据存储库 我需要保留这些文件 并且不要让 iOS 删除它们 通常 我不希望 iCloud 备份这些文件 我应该把它们保存在哪里 iOS5 0 及更早版本 5 0 1 和 5 1 及更高版本中保存文件的本地更改主
  • 从选定的文件夹中获取大小 >100MB 的文件列表及其路径目标 c

    我想获取我的 mac 系统的所有文件及其路径和大小的列表 由此 我只想过滤那些文件大小超过 100 MB 的文件 我使用下面的代码获取了系统的大小 NSError error NSFileManager fileManager NSFile
  • 使用 in 子句按数组顺序对 NSPredicate 进行排序

    我有一个NSPredicate会在一个内搜索 idNSArray的 ID 就像是 id in array 有没有办法获得按相同数组顺序排序的提取结果集 我现在的代码是 NSArray findIn NSArray identifiers i
  • 在 Java 中停止线程? [复制]

    这个问题在这里已经有答案了 我正在编写一段代码 该代码连接到服务器 使用该连接生成一堆线程并执行一堆 东西 在某些情况下 连接会失败 我需要停止一切并从头开始使用新对象 我想在对象之后进行清理 但在线程上调用 thread stop 但此方
  • Erlang 进程如何(如果有的话)映射到内核线程?

    Erlang 因能够支持许多轻量级进程而闻名 它之所以能做到这一点 是因为它们不是传统意义上的进程 甚至不是 P 线程中的线程 而是完全在用户空间中的线程 这很好 实际上很棒 那么 Erlang 线程如何在多核 多处理器环境中并行执行呢 当

随机推荐