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

Pur*_*irl 27 cocoa objective-c 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];
}
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,这段代码没有任何功能问题 - 我唯一的牛肉是风格的.在我的情况下,流程很简单,它可以工作,但尝试封装它或抛出一些条件,事情可能变得丑陋.有点唠叨我,我无法找到一种方法等待,然后回到像这个(虚构)示例的代码中的相同点:

- (void) buttonPressed {
    [self doStuff];
    [UIMagicUnicorn waitForDuration:0.35];
    [self doStuffAfterWaiting];
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*son 68

usleep(1000000);
Run Code Online (Sandbox Code Playgroud)

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

两者都会睡1秒钟.

  • 这两个都会阻止线程做其他任何事情.糟糕,如果它在主UI线程中. (9认同)
  • 真正.如果您需要UI在此期间做出响应,问题中建议的方法,NSTimer触发一次(如您所建议),或执行此延迟的后台线程会更好. (3认同)

Jas*_*ore 10

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

[NSTimer scheduledTimerWithTimeInterval:0.5f 
                                 target:self
                               selector: @selector(doSomething:) 
                               userInfo:nil
                                repeats:NO];
Run Code Online (Sandbox Code Playgroud)

你想避免像usleep()那样只会挂起你的应用程序并让它感觉不响应.

  • "你想要避免像usleep()那样只会挂起你的应用程序,让它感觉没有反应."很明显,如果你从主线程中调用了'usleep`,这才是真的. (7认同)