我怎样才能将方法调用延迟1秒钟?

有没有一种简单的方法可以将方法调用延迟1秒钟?

我有一个 UIImageView,它对触摸事件有反应。当触摸被检测到时,一些动画会在应用程序中发生。一秒钟之后,我想调用另一个方法。在这种情况下,我不能使用 animationDidStop选择器。

177981 次浏览

注意: 这将暂停整个线程,而不仅仅是一个方法。
在调用方法之前调用 sleep/wait/stop 1000 ms?

Sleep(1000); // does nothing the next 1000 mSek


Methodcall(params); // now do the real thing

编辑: 上面的答案适用于一般问题“我怎样才能将方法调用延迟1秒?”,这是在回答问题时提出的问题(事实上,答案是在原问题的7分钟内给出的: ——)。 当时没有关于这门语言的信息,所以请停止抱怨正确的使用睡眠 i XCode 的方法和缺乏类..。

performSelector:withObject:afterDelay:

文件参考

最好的办法是:

[self performSelector:@selector(YourFunctionName)
withObject:(can be Self or Object from other Classes)
afterDelay:(Time Of Delay)];

也可以将 nil 作为 withObject 参数传递。

例如:

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

可以在0.1秒延迟方法调用以下代码执行此操作之后使用执行选择器。

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1];

你也可以用块

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[object method];
});

在大多数情况下,您可能希望使用 patch _ get _ main _ queue,但是如果该方法中没有 UI,则可以使用 全局队列全局队列

编辑:

Swift 3版本:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
object.method()
}

同样,DispatchQueue.global().asyncAfter(...也可能是一个不错的选择。

你亦可:

[UIView animateWithDuration:1.0
animations:^{ self.view.alpha = 1.1; /* Some fake chages */ }
completion:^(BOOL finished)
{
NSLog(@"A second lapsed.");
}];

这种情况下,你必须伪造一些变化,以获得一些视图的动画工作。它确实有些粗俗,但我喜欢基于块的东西。或者总结@mcfedr 回答如下。


waitFor(1.0, ^
{
NSLog(@"A second lapsed");
});

typedef void (^WaitCompletionBlock)();
void waitFor(NSTimeInterval duration, WaitCompletionBlock completion)
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC),
dispatch_get_main_queue(), ^
{ completion(); });
}

你能做到的

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];

已经有很多答案了,而且都是正确的。如果您想使用 dispatch_after,您应该寻找包含在右下角的 Code Snippet Library中的代码片段(您可以在其中选择 UI元素)。

enter image description here

因此,您只需要通过编写 调度中心代码来调用这个代码片段:

enter image description here

在已检查的解决方案中有一个 Swift 3解决方案:

self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)

这就是方法

@objc fileprivate func targetMethod(){


}

Swift 2. x

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
print("do some work")
}

斯威夫特3 x —— & ——斯威夫特4

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
print("do some work")
}

或者通过 escaping closure

func delay(seconds: Double, completion: @escaping()-> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: completion)
}

在 Swift 3中使用

perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)