当用户单击按钮时,将启动一个操作,但如果用户快速单击该按钮10次,则会执行10次。我想在控件从事件返回之前禁用才会生效。
- (IBAction)btnQuickCheckClick:(id)sender {
@try {
self.btnQuickCheck.enabled = NO ;
// Next line takes about 3 seconds to execute:
[self pollRouter] ;
}
@finally {
self.btnQuickCheck.enabled = YES ;
}
}
答案 0 :(得分:1)
您可以在轮询前禁用按钮后运行运行循环来更新UI:
- (IBAction)btnQuickCheckClick:(id)sender {
self.btnQuickCheck.enabled = NO;
// give some time for the update to take place
[self performSelector:@selector(pollRouterMethod) withObject:nil afterDelay:0.1];
}
- (void)pollRouterMethod {
@try {
[self pollRouter];
} @catch (NSException * e) { }
// re-enable the button
self.btnQuickCheck.enabled = YES;
}
当然,这种方法无法替代在另一个线程上运行时间密集型任务。对于长期任务,多线程几乎总是可行的。
答案 1 :(得分:1)
另一种方法是使用块:
Big Pro:您不需要创建额外的方法:)
- (IBAction)btnQuickCheckClick:(id)sender {
//UI changes must be done in the main thread
self.btnQuickCheck.enabled = NO;
//do your thing in a background thread
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT ,0);
dispatch_async(queue, ^(){
@try {
//do your thing here
[self pollRouter];
} @catch (NSException * e) {
//handle the exception, if needed
} @finally {
//change to the main thread again and re-enable the UI
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^(){
self.btnQuickCheck.enabled = YES;
});
}
});
}
这将在后台线程中运行pollRouter
。因此,如果你没有修改UI或其他非线程安全的东西,你想使用这种方法:)否则去@ Alex的方法