自定义模态对话框和后台操作

时间:2012-02-16 13:06:52

标签: objective-c cocoa modal-dialog background-process cocoa-sheet

我有一个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,需要一个完成块。

1 个答案:

答案 0 :(得分:0)

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

  

<强>讨论

     

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

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

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