【问题标题】:Ignoring user input while waiting for a task - Objective-C在等待任务时忽略用户输入 - Objective-C
【发布时间】:2009-11-30 03:37:02
【问题描述】:

我有一个带有“转换”按钮的应用程序。当我单击此按钮时,应用程序会使用 NSTask 启动一个新进程,然后按钮灰显,直到进程完成。

我的问题是,该应用程序会保存用户在等待过程完成时所做的任何点击。因此,即使按钮是灰色的,用户也可以单击它,并且该过程将在完成后立即重新开始。

我正在等待进程完成使用:

[task waitUntilExit];

在等待此任务完成时如何忽略任何用户输入?

【问题讨论】:

    标签: objective-c cocoa nstask


    【解决方案1】:

    -[NSTask waitUntilExit] 当然是一个阻塞调用。这意味着线程暂停(就像运行循环一样),并且所有发送到线程的事件都排队等待运行循环可以处理它们。

    我会做这样的事情,而不是 waitUntilExit

    - (IBAction) myButtonMethod {
      NSTask * task = ....;
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskFinished:) name:NSTaskDidTerminateNotification object:task];
      [myButton setEnabled:NO];
      [task launch];
    }
    
    - (void) taskFinished:(NSNotification *)note {
      [myButton setEnabled:YES];
    }
    

    这将启动您的任务,禁用按钮,但不会阻塞线程,因为您无需等待它完成。相反,您正在等待任务完成时的异步通知。由于该按钮在任务完成之前被禁用,因此这将忽略发送给它的所有事件。

    【讨论】:

      【解决方案2】:

      更简单:

      [[UIApplication sharedApplication] beginIgnoringInteractionEvents];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-14
        相关资源
        最近更新 更多