1

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

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

我正在等待该过程完成使用:

[task waitUntilExit];

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

4

2 回答 2

6

-[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];
}

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

于 2009-11-30T03:59:29.223 回答
0

更容易:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
于 2011-03-15T23:11:55.300 回答