在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];
}
答案 0 :(得分:67)
有
usleep(1000000);
和
[NSThread sleepForTimeInterval:1.0f];
两者都会睡1秒钟。
答案 1 :(得分:10)
这是NSTimer的做法。它可能比你正在使用的方法更加丑陋,但它允许重复事件,所以我更喜欢它。
[NSTimer scheduledTimerWithTimeInterval:0.5f
target:self
selector: @selector(doSomething:)
userInfo:nil
repeats:NO];
你想要避免使用像usleep()这样的东西,这会让你的应用程序挂起并让它感觉没有反应。
答案 2 :(得分:3)
我不确定它是否存在(但是),但是使用10.6中的块(或10.5中的PLBlocks以及iPhone上),编写像performBlock:afterDelay:
这样的小包装应该很容易这完全符合您的要求而无需睡眠整个线程。确实是一段很有用的代码。
Mike Ash有written about an approach like this on his blog:
NSString *something = ...;
RunAfterDelay(0, ^{
NSLog(@"%@", something);
[self doWorkWithSomething: something];
});
答案 3 :(得分:2)
你可能想要使用NSTimer并让它发送一个“doStuffAfterWaiting”消息作为你的回调。任何类型的“睡眠”都会阻止线程直到它被唤醒。如果它在你的U.I.线程,它会导致你的应用程序显得“死”。即使情况并非如此,这也是不好的形式。回调方法将释放CPU以执行其他任务,直到达到指定的时间间隔。
此doc有使用示例,并讨论了如何与&在哪里创建计时器。
当然,performSelector:afterDelay:做同样的事情。
答案 4 :(得分:2)
简单usleep
有什么问题?我的意思是,除了“可可纯度”之外,它仍然比其他解决方案短得多:)
答案 5 :(得分:0)
稍微提供更多信息,链接指向NSThread sleepForTimeInterval:
这实际上是从What's the equivalent of Java's Thread.sleep() in Objective-C/Cocoa?
中偷走的答案 6 :(得分:0)
如果您不介意异步解决方案,请转到:
[[NSOperationQueue currentQueue] addOperationWithBlock:^{
[self doStuffAfterWaiting];
}];