【问题标题】: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];