在两行后面执行之间添加延迟
我需要在(相同)函数中执行两行之间添加延迟。 是否有任何有利的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。