Отключить буферизацию повторных нажатий кнопок - PullRequest
1 голос
/ 18 августа 2011

Когда пользователь нажимает кнопку, действие запускается, но если пользователь быстро нажимает кнопку 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 ;
  }    
}

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Другой способ сделать это с блоками:

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 в фоновом потоке. Так что, если вы не модифицируете пользовательский интерфейс или другие вещи, не поддерживающие потоки, вы можете использовать этот подход :) В противном случае перейдите к подходу @ Alex

1 голос
/ 18 августа 2011

Пользовательский интерфейс можно обновить, запустив цикл выполнения после отключения кнопки перед опросом:

- (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;
}

Конечно, этот метод не может заменить выполнение задачи, требующей много времени, в другом потоке. Для длинных задач многопоточность - почти всегда путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...