我有一个可可应用程序,其中包含一个自定义的多步帐户设置,我将其作为带有一组视图的自定义模态对话框实现。

问题在于背景操作(获取URL)似乎被卡住了。我认为这是因为应用程序处于模式模式。

在这里,代码启动模式对话框:

[NSApp beginSheet:accountSetupController.window modalForWindow:self.window 
            modalDelegate:nil didEndSelector:NULL contextInfo:NULL];

[accountSetupController beginAccountSetup]; // this later launches the background operation
[NSApp runModalForWindow:accountSetupController.window];

NSApp endSheet:accountSetupController.window];

首先,我的假设正确吗?即使应用程序正在运行模式,有没有办法进行背景操作?

实际的背景操作不受我的控制。这是一个需要完成块的外部API。

有帮助吗?

解决方案

查看您致电的“讨论”部分 [NSApplication beginSheet: modalForWindow: ...]:

讨论

此方法同步运行指定表的模态事件循环。它显示表格,使其保持关键,启动跑步循环,并为其处理事件。 当应用程序在运行循环中时,除非与工作表相关联,否则它不会响应其他任何事件(包括鼠标,键盘或窗口粘液事件)。它还没有执行与模态跑步循环无关的任何任务(例如射击计时器)。换句话说,此方法仅消耗足够的CPU时间来处理事件并将其分配到与模态窗口相关的操作方法。

对我来说,这意味着在此模态会话进行时,背景线程和任务未运行。我以前遇到了这个问题,我自己的模态对话框试图访问Web服务器(如果我没记错的话,出于注册目的)。

最好的解决方案是,如果您需要异步与服务器通信,则不要使用模态对话框。如果您必须使用模态对话框,请尝试在模态纸之间进行通信(即,当用户命中“提交”时,结束工作表并进行服务器聊天,然后提出下一步的下一张表)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top