【问题标题】:Objective C Multi thread NSWindow alternative?Objective C 多线程 NSWindow 替代方案?
【发布时间】:2015-07-25 20:19:13
【问题描述】:

我在做的时候总是崩溃:

[NSWindow orderFront:nil]

来自我在我的应用程序中生成的线程。是否无法像 GTK+ 那样使用线程中的 UI 元素?

编辑: 哦,天哪,刚刚发现这个: https://stackoverflow.com/a/11900929/1828637

所以显然我不能从另一个线程使用 NSWindow,所以 objc 出来了,是否可以用 CoreFoundation 来做多线程窗口的东西?我必须从线程做,所以我正在寻找替代方法

【问题讨论】:

  • 您只能在主线程上使用 UI 元素。
  • 谢谢@remus 这也适用于CoreFoundation吗?
  • CF 可以在后台线程上运行,只要您触发 UI 更新的通知配置为在主线程上运行。阅读更多here
  • 还有其他方法可以做到这一点,但 GCD 消除了所有的猜测,让开发人员管理线程变得非常简单。
  • 我已经在我的第二条评论中链接到苹果文档 - 检查一下。过去,开始阅读吧。

标签: objective-c core-foundation


【解决方案1】:

您只能在主线程上使用 UI 元素。

我使用 GCD 来确保所有 UI 活动都在正确的线程上运行:

dispatch_sync(dispatch_get_main_queue(), ^{
    // Do your UI updates!
});

why:

在 Cocoa Touch 中,UIApplication 即应用程序的实例被附加到主线程,因为该线程是由 Cocoa Touch 的入口点函数 UIApplicatioMain() 创建的。它设置主事件循环,包括应用程序的运行循环,并开始处理事件。应用程序的主事件循环接收所有 UI 事件,即触摸、手势等。

【讨论】:

  • 我注意到这只是10.6+,我正在阅读但我找不到支持
  • 您必须使用 performSelectorInBackground:withObject:detachNewThreadSelector:toTarget:withObject: 之类的东西。阅读 NSThread。
【解决方案2】:

UI 交互总是必须在主线程上完成。

您可以简单地在主线程上使用 GCD 调度有问题的代码:

dispatch_async( dispatch_get_main_queue(), ^(void)
{
   [NSWindow orderFront:nil];
});

【讨论】:

  • 非常感谢@Amin 是否可以从 CoreFoundation 的线程中做到这一点?
  • 不,只需在主线程上使用 GCD 调度用于 UI 操作的代码。
  • 我注意到这只是10.6+,我正在阅读但我找不到支持
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2012-12-06
相关资源
最近更新 更多