2013-02-18 2 views
0

Я хотел бы вставить задержку NSTimer внутри метода и задавался вопросом, как это сделать. Я выделил место, где хотел бы поставить таймер задержки.Как вставить NSTimer в метод?

вот мой код до сих пор:

- (void) buttonPressed:(UIButton*) sender { 

for(int i = 0;i < [categoryBtnImages count]; i++) 
{ 
    UIButton *but = (UIButton *)[catButtonArray objectAtIndex:i]; 
    if(but != sender) 
    { 
     [but setImage:[UIImage imageNamed:[categoryBtnImages objectAtIndex:i]] forState:UIControlStateNormal]; 
     // but.selected = !but.selected; 

    } 
} 

buttonCat = (UIButton *)sender; 
int tagOfButton = buttonCat.tag - 2; 

if (tagOfButton == -2){ 
    tagOfButton = 8; 
} 
[buttonCat setImage:[UIImage imageNamed:[categoryBtnImagesSel objectAtIndex:tagOfButton]] forState:UIControlStateNormal]; 

Я хотел бы поставить задержку здесь затем запустить остальной код, но все это из этого метода.

if ([sender.titleLabel.text isEqualToString:@"Button 0"]) { 
    [self foodCatSort:nil]; 
    [self.tableView reloadData]; 


} 
if ([sender.titleLabel.text isEqualToString:@"Button 1"]) { 
    [self healthCatSort:nil]; 
    [self.tableView reloadData]; 

} 
if ([sender.titleLabel.text isEqualToString:@"Button 2"]) { 
    [self shoppingCatSort:nil]; 
    [self.tableView reloadData]; 

} 

}

FYI причина, почему я хочу сделать это потому, что нажата кнопка, которая перезагружает таблицу и изменения состояния кнопки изображения. Я хотел бы, чтобы пользователь сначала увидел изменение изображения uibutton, а затем перезагрузил таблицу. Я думал, что отсрочка решит это.

+1

Вы не должны этого делать, поскольку это прервет основной поток пользовательского интерфейса, что даст плохой интерфейс. Вместо этого задержка выполняется, выполняя то, что вы хотите делать в методе * таймера * объекта NSTimer. – trojanfoe

+0

Основное соглашение с trojanfoe об этом - никогда не блокируйте поток пользовательского интерфейса для тривиальных вещей. Просто используйте performSelector: withObject: afterDelay - и расщепление ваших методов не так уж плохо. Прерывание вашей работы в логические единицы действия дает гораздо более читаемый код. – CrimsonDiego

+3

Вы не можете/не должны задерживаться в рамках метода. Вы делаете первую часть, а затем планируете выполнение второй части. –

ответ

1

Если вам просто нужна задержка, вам не нужен NSTimer.

Использовать вместо performselector: withObject: afterDelay:.

Что-то вроде этого:

[self performSelector:@selector(yourDelayedMethod) withObject:nil afterDelay:2]; 
+0

но это вызывает другой способ. Мне было интересно, могу ли я сделать это одним и тем же методом. спасибо – hanumanDev

+0

@hanumanDev Почему он должен быть в том же методе? – trojanfoe

+2

Вы не можете сделать это в рамках одного и того же метода (в потоке пользовательского интерфейса) и пройти тесты Apple (или добиться хорошей работы приложения, если на то пошло). –

-5

Вы можете использовать sleep добавить задержку:

sleep(delta); 

Где delta задержка времени вы хотите добавить.

+1

Нет, вы не можете этого сделать, поскольку это прервет поток пользовательского интерфейса. – trojanfoe

+1

Конечно, это не значит, что вы не можете этого сделать. – rptwsthi

+3

Хорошо, тогда вы не должны этого делать ... есть много способов обеспечить плохой пользовательский опыт, и это один из них. – trojanfoe

1

Я предполагаю, что причина, вы настаивали на обеих половинах, являющихся частью одного и того же метода для локальной переменной доступа. Это на самом деле возможно, просто не с NSTimer. Чтобы сохранить код, который вы хотите задержать полностью в том же объеме, что и оригинальный метод, вы можете использовать dispatch_after():

[buttonCat setImage:[UIImage imageNamed:[categoryBtnImagesSel objectAtIndex:tagOfButton]] forState:UIControlStateNormal]; 

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.75 * NSEC_PER_SEC)); 
dispatch_after(delay, dispatch_get_main_queue(), ^(void){ 

    if ([sender.titleLabel.text isEqualToString:@"Button 0"]) { 
     [self foodCatSort:nil]; 
     [self.tableView reloadData]; 
    } 
    if ([sender.titleLabel.text isEqualToString:@"Button 1"]) { 
     [self healthCatSort:nil]; 
     [self.tableView reloadData]; 

    } 
    if ([sender.titleLabel.text isEqualToString:@"Button 2"]) { 
     [self shoppingCatSort:nil]; 
     [self.tableView reloadData]; 

    } 
}); 

Вы должны также, вероятно, искать в использовании своего рода анимации для этого, так как произвольно своевременна задержка между эффектами пользовательского интерфейса может показаться неудобной для пользователя.

Смежные вопросы