gpt4 book ai didi

iphone - NSThread 和 UIViewController 交互

转载 作者:行者123 更新时间:2023-12-03 16:11:01 25 4
gpt4 key购买 nike

如果我生成一个新线程,然后在其中使用如下代码将新 Controller 推送到我的 UINavigationController 上...

(a) 不工作

-(void)myCallbackInThread
{
// move on...
UIApplication* app = [UIApplication sharedApplication];
[app changeView];
}

然后我发现 View 出现了,但不响应用户输入。

如果我像这样更改代码

(b) 工作

-(void)myCallbackInThread
{
// move on...
UIApplication* app = [UIApplication sharedApplication];
[app performSelectorOnMainThread:@selector(moveToMain) withObject:nil waitUntilDone:FALSE];
}

然后一切正常。

有任何关于原因的提示吗?

最佳答案

在您的情况下,这实际上取决于 [app changeView] 中发生的情况,但它停止响应的原因很可能是您的新辅助线程上没有运行循环调度事件(更多内容请参见下文)。然而,一般来说,从辅助线程更新 GUI 是一个非常糟糕的主意。正如您已经发现的,所有这些事件都应该通过主线程。

您的第二个示例工作而不是第一个示例工作的主要原因是 UIApplication 在主线程上为您设置并处理运行循环和事件调度程序。因此,当您调用performSelectorInMainThread时,选择器将被分派(dispatch)到主运行循环,该循环随后能够处理您的gui输入和其他事件。事件调度程序也由 UIApplication 在主线程上运行和管理。

所以基本上,不要在辅助线程上执行任何 GUI 管理事件。将它们分派(dispatch)到主线程。如果您需要在辅助线程上进行处理(例如计时器或异步调用等),那么您必须在该线程上启动并管理您自己的运行循环(有关管理运行循环的更多信息,请参阅NSRunLoop)。

关于iphone - NSThread 和 UIViewController 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/167487/

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