【问题标题】:Custom modal dialog and background operations自定义模态对话框和后台操作
【发布时间】:2012-02-16 13:06:52
【问题描述】:

我有一个带有自定义多步骤帐户设置的 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。

【问题讨论】:

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


    【解决方案1】:

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

    讨论

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

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

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

    【讨论】:

    • 好的,感谢您确认我的假设。我可能会将对话框显示为单独的实用程序窗口。从用户体验的角度来看,这不是一个想法,但它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多