1

我有一个带有自定义多步骤帐户设置的 Cocoa 应用程序,我将其实现为带有一组视图的自定义模式对话框。

问题是后台操作(获取 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。

4

1 回答 1

0

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

讨论

此方法同步运行指定工作表的模式事件循环。它显示工作表,使其成为关键,启动运行循环并为其处理事件。当应用程序处于运行循环中时,它不会响应任何其他事件(包括鼠标、键盘或窗口关闭事件),除非它们与工作表相关联。它也不执行任何与模态运行循环无关的任务(例如触发计时器)。换句话说,此方法仅消耗足够的 CPU 时间来处理事件并将它们分派到与模态窗口关联的操作方法。

对我来说,这意味着在这个模态会话进行时后台线​​程和任务没有运行。我之前遇到过这个问题,我自己的模式对话框试图访问 Web 服务器(如果我没记错的话,为了注册目的)。

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

于 2012-02-16T13:17:04.760 回答