在Cocoa中等待指定的持续时间

时间:2010-02-09 20:38:20

标签: objective-c cocoa wait

在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];
}

7 个答案:

答案 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)

Tadah

稍微提供更多信息,链接指向NSThread sleepForTimeInterval:

这实际上是从What's the equivalent of Java's Thread.sleep() in Objective-C/Cocoa?

中偷走的

答案 6 :(得分:0)

如果您不介意异步解决方案,请转到:

[[NSOperationQueue currentQueue] addOperationWithBlock:^{
    [self doStuffAfterWaiting];
}];