Iphone 如何在方法中插入NSTimer?
我想在一个方法中插入一个NSTimer延迟,我想知道如何执行此操作。我已经用粗体标出了延迟计时器的位置 以下是我目前的代码:Iphone 如何在方法中插入NSTimer?,iphone,ios,objective-c,nstimer,Iphone,Ios,Objective C,Nstimer,我想在一个方法中插入一个NSTimer延迟,我想知道如何执行此操作。我已经用粗体标出了延迟计时器的位置 以下是我目前的代码: - (void) buttonPressed:(UIButton*) sender { for(int i = 0;i < [categoryBtnImages count]; i++) { UIButton *but = (UIButton *)[catButtonArray objectAtIndex:i]; if(but != sender)
- (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];
}
仅供参考,我之所以要这样做是因为按下一个按钮会重新加载表格,并且按钮状态图像会发生变化。我希望用户先看到uibutton图像的更改,然后重新加载表。我想延迟可以解决这个问题。如果你只需要延迟,你不需要时间 改为使用性能选择器:withObject:afterDelay: 大概是这样的:
[self performSelector:@selector(yourDelayedMethod) withObject:nil afterDelay:2];
我假设你坚持两个部分都是同一个方法的一部分的原因是为了局部变量访问。这实际上是可能的,只是不需要
NSTimer
。要将要延迟的代码完全保留在与原始方法相同的范围内,可以使用dispatch\u after()
:
您可能还应该考虑为此使用某种动画,因为UI效果之间的任意时间延迟可能会让用户感到尴尬。您不应该这样做,因为这会中断主UI线程,从而带来糟糕的UI体验。相反,延迟是通过在
NSTimer
对象的计时器触发方法中执行您想要执行的任何操作来实现的。与特洛伊木马程序在这一点上达成了主要协议-决不要为琐事阻塞UI线程。只需使用performSelector:withObject:afterDelay,拆分方法并不是一件坏事。将您的工作分解为逻辑操作单元也会产生更具可读性的代码。您不能/不应该在方法中延迟。你先做第一部分,然后安排第二部分的执行。当然,你可以设置过渡的动画。但这需要另一种方法。我想知道我是否可以用同样的方法来做。谢谢,你不能用同样的方法(在UI线程中)通过苹果测试(或者实现良好的应用程序操作)。
[self performSelector:@selector(yourDelayedMethod) withObject:nil afterDelay:2];
[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];
}
});