Xcode Objective-C | iOS:延迟功能/ NSTimer帮助?

Ret*_*tro 33 xcode timer objective-c delay ios4

所以我正在开发我的第一个iOS应用程序,我需要帮助..

现在简单的程序,我有9个按键,当我按下第一个按钮,或任何按钮,我只是想的第一个按钮,以突出60毫秒,unhighlight,第二个按钮的亮点,等待60毫秒,unhighlight等为其余的按钮让它看起来像一个移动的LED.

我看起来已经尝试过睡眠/睡眠,但是一旦睡眠持续时间完成,它似乎一起跳过高亮/不亮.

例如:

- (void) button_circleBusy:(id)sender{
firstButton.enabled = NO;
sleep(1);
firstButton.enabled = YES;
Run Code Online (Sandbox Code Playgroud)

等等其他按钮.它会延迟,但它不会延迟"firstButton.enabled = NO;".我为每个按钮的"禁用状态"画了一张照片,我从来没有看到它.

任何帮助表示赞赏!我已经研究过NSTimer,但我不确定如何实现它.

谢谢.

- 保罗

ugh*_*fhw 51

sleep不起作用,因为只有在主线程返回系统后才能更新显示.NSTimer是要走的路.为此,您需要实现定时器调用以更改按钮的方法.一个例子:

- (void)button_circleBusy:(id)sender {
    firstButton.enabled = NO;
    // 60 milliseconds is .06 seconds
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];
}
- (void)goToSecondButton:(id)sender {
    firstButton.enabled = YES;
    secondButton.enabled = NO;
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToThirdButton:) userInfo:nil repeats:NO];
}
...
Run Code Online (Sandbox Code Playgroud)


Avn*_*arr 47

int64_t delayInSeconds = 0.6;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     do something to the button(s)
});
Run Code Online (Sandbox Code Playgroud)


Ale*_*aas 29

更少的代码是更好的代码.

[NSThread sleepForTimeInterval:0.06];
Run Code Online (Sandbox Code Playgroud)

迅速:

Thread.sleep(forTimeInterval: 0.06)
Run Code Online (Sandbox Code Playgroud)

  • 睡眠会阻塞线程.因此会有副作用,它对UI线程没有用. (2认同)

ram*_*ogm 25

稍微简单的方法是使用performSelector:withObject:afterDelay:它为您设置NSTimer对象并且可以轻松取消

继续前面的例子就是这样

[self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06];
Run Code Online (Sandbox Code Playgroud)

更多信息在文档中


Joe*_*ker 16

尝试

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
Run Code Online (Sandbox Code Playgroud)