在两行后面执行之间添加延迟

我需要在(相同)函数中执行两行之间添加延迟。 是否有任何有利的select来做到这一点?

注意:我不需要两个不同的函数来执行这个操作,而延迟不会影响其他函数的执行。

例如:

line 1: [executing first operation]; line 2: Delay /* I need to introduce delay here */ line 3: [executing second operation]; 

任何帮助是可观的。 提前致谢…

你可以使用gcd来做到这一点,而不必创build另一种方法

 double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ NSLog(@"Do some work"); }); 

你仍然应该问自己:“我真的需要增加一个延迟”,因为它通常会使代码复杂化并导致竞争条件

您可以使用NSThread方法:

 [NSThread sleepForTimeInterval: delay]; 

但是,如果您在主线程上执行此操作,则会阻止该应用程序,因此只能在后台线程上执行此操作。


或者在Swift中

 NSThread.sleepForTimeInterval(delay) 

在Swift 3

 Thread.sleep(forTimeInterval: delay) 

该行在3秒后调用select器secondMethod:

 [self performSelector:@selector(secondMethod) withObject:nil afterDelay:3.0 ]; 

在你的第二个操作中用你想要的延迟来使用它。 如果你有很多代码,把它放在它自己的方法中,并用performSelector:调用这个方法。 它不会像sleep一样阻止用户界面

编辑:如果你不想要第二种方法,你可以添加一个类别,以便能够使用带有performSelector的块:

 @implementation NSObject (PerformBlockAfterDelay) - (void)performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay { block = [block copy]; [self performSelector:@selector(fireBlockAfterDelay:) withObject:block afterDelay:delay]; } - (void)fireBlockAfterDelay:(void (^)(void))block { block(); } @end 

或者甚至更干净:

 void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void)) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay), dispatch_get_current_queue(), block); } 

我有几个基于回合的游戏,我需要AI在轮到之前(以及在轮到它之间)暂停。 我相信还有其他更有用的情况,延迟是最好的解决scheme。 在Swift中:

  let delay = 2.0 * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue()) { self.playerTapped(aiPlayView) } 

我刚回到这里来看看Objective-C的调用是不是一样的(我也需要把它加到那个)。

如果您定位iOS 4.0+,则可以执行以下操作:

 [executing first operation]; double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [executing second operation]; }); 

像@Sunkas写道, performSelector:withObject:afterDelay:dispatch_after的吊坠,只是它更短,而且具有正常的objective-c语法。 如果需要将parameter passing给要延迟的块,可以将它们传递给参数withObject ,然后在您调用的selector接收该参数:

 [self performSelector:@selector(testStringMethod:) withObject:@"Test Test" afterDelay:0.5]; - (void)testStringMethod:(NSString *)string{ NSLog(@"string >>> %@", string); } 

如果您仍想在主线程或当前线程上执行select,可以使用特定的方法来指定它。 苹果文档告诉:

如果您希望消息在运行循环处于默认模式以外的模式时出列,请改为使用performSelector:withObject:afterDelay:inModes:方法。 如果您不确定当前线程是否为主线程,则可以使用performSelectorOnMainThread:withObject:waitUntilDone:或performSelectorOnMainThread:withObject:waitUntilDone:modes:方法来确保您的select器在主线程上执行。 要取消排队的消息,请使用cancelPreviousPerformRequestsWithTarget:或cancelPreviousPerformRequestsWithTarget:selector:object:method。