我有一个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,需要一个完成块。
答案 0 :(得分:0)
请查看您对[NSApplication beginSheet: modalForWindow: ...]
的电话的“讨论”部分:
<强>讨论强>
此方法运行指定工作表的模态事件循环 同步。它显示工作表,使其成为关键,开始运行 循环,并为其处理事件。 当应用程序处于运行状态时 循环,它不响应任何其他事件(包括鼠标, 键盘或窗口关闭事件)除非它们与 片。它也不执行任何任务(例如发射计时器) 与模态运行循环无关。换句话说,这个 方法仅消耗足够的CPU时间来处理事件和分派 它们与模态窗口相关的动作方法。
对我而言,这意味着在此模式会话进行时后台线程和任务未运行。我之前遇到过这个问题,我自己的模态对话框试图访问Web服务器(如果我没记错的话,用于注册目的)。
如果您需要异步与服务器通信,最好的解决方案是不使用模态对话框。如果你必须使用模态对话框,尝试在模态表之间进行通信(即当用户点击“提交”时,结束工作表并进行服务器聊天,然后调出下一页的下一页)。