29

有没有比我在下面提出的更直接的方法来在 Cocoa 中等待特定的时间?

- (void) buttonPressed {
    [self makeSomeChanges];

    // give the user some visual feedback and wait a bit so he can see it
    [self displayThoseChangesToTheUser];
    [self performSelector:@selector(buttonPressedPart2:) withObject:nil afterDelay:0.35];
}

- (void) buttonPressedPart2: (id)unused {
    [self automaticallyReturnToPreviousView];
}

需要明确的是,这段代码没有功能问题——我唯一的缺点是文体问题。在我的情况下,流程很简单,它可以工作,但尝试封装它或加入一些条件,事情可能会变得丑陋。有点烦我,我找不到等待的方法,然后在像这样(虚构)示例的代码中返回同一点:

- (void) buttonPressed {
    [self doStuff];
    [UIMagicUnicorn waitForDuration:0.35];
    [self doStuffAfterWaiting];
}
4

7 回答 7

73

usleep(1000000);

[NSThread sleepForTimeInterval:1.0f];

两者都将休眠 1 秒。

于 2010-02-09T20:43:53.663 回答
13

这是 NSTimer 的做法。它可能比您使用的方法更丑陋,但它允许重复事件,所以我更喜欢它。

[NSTimer scheduledTimerWithTimeInterval:0.5f 
                                 target:self
                               selector: @selector(doSomething:) 
                               userInfo:nil
                                repeats:NO];

你想避免像 usleep() 这样的东西,它只会挂起你的应用程序并让它感觉没有响应。

于 2010-02-09T20:51:51.303 回答
3

我不确定它是否存在(还存在),但是使用 10.6 中的块(或10.5 和 iPhone 上的PLBlocks),编写一个小包装器应该很容易,就像performBlock:afterDelay:你想要的那样,不需要睡觉整个线程。确实是一段有用的小代码。

Mike Ash在他的博客上写过这样的方法

NSString *something = ...;
RunAfterDelay(0, ^{
    NSLog(@"%@", something);
    [self doWorkWithSomething: something];
});
于 2010-02-09T20:44:30.530 回答
2

您可能想要使用NSTimer并让它发送“doStuffAfterWaiting”消息作为回调。任何类型的“睡眠”都会阻塞线程,直到它醒来。如果它在您的 UI 线程中,它将导致您的应用程序显示为“死”。即使不是这样,也是不好的形式。回调方法将释放 CPU 以执行其他任务,直到达到您指定的时间间隔。

文档包含使用示例,并讨论了创建计时器的方式和位置的差异。

当然, performSelector:afterDelay: 做同样的事情。

于 2010-02-09T20:42:53.727 回答
2

简单的有什么问题usleep?我的意思是,除了“可可纯度”之外,它仍然比其他解决方案短得多:)

于 2010-02-09T20:45:46.217 回答
1

如果您不介意异步解决方案,请执行以下操作:

[[NSOperationQueue currentQueue] addOperationWithBlock:^{
    [self doStuffAfterWaiting];
}];
于 2016-09-17T22:40:23.307 回答
0

等等,有NSThread sleepForTimeInterval:

该解决方案实际上取自:Objective-C/Cocoa 中 Java 的 Thread.sleep() 的等价物是什么?

于 2010-02-09T20:42:59.250 回答