如何将方法调用延迟1秒?

时间:2009-05-28 12:51:46

标签: ios objective-c iphone cocoa-touch uikit

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

我有UIImageView对触摸事件做出反应。检测到触摸时,应用程序中会出现一些动画。一秒钟后,我想调用另一种方法。在这种情况下,我无法使用animationDidStop选择器。

11 个答案:

答案 0 :(得分:253)

performSelector:withObject:afterDelay:

Document Reference

答案 1 :(得分:191)

你也可以使用一个块

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

大多数情况下,您会想要使用dispatch_get_main_queue,但如果方法中没有用户界面,则可以使用global queue

修改

Swift 3版本:

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

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

答案 2 :(得分:125)

最好的方法是:

[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 ];

答案 3 :(得分:24)

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

enter image description here

因此,您只需在代码中编写 dispatch 来调用此代码段:

enter image description here

答案 4 :(得分:17)

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

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

答案 5 :(得分:9)

你也可以:

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

这种情况下,您必须对某些视图进行一些更改才能使动画生效。确实是hacky,但我喜欢基于块的东西。或者在下面结束@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(); });
}

答案 6 :(得分:7)

你可以这样做

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

答案 7 :(得分:4)

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")
}

Swift 3.x - & - Swift 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)
}

答案 8 :(得分:1)

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

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

还有方法

@objc fileprivate func targetMethod(){

}

答案 9 :(得分:0)

在Swift 3中使用

shpNeu.Width = 1000

答案 10 :(得分:-35)

注意:这会暂停整个线程,而不仅仅是一种方法。
在调用方法之前,打电话给睡眠/等待/停止1000毫秒?

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

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

编辑:上面的答案适用于一般问题“如何延迟方法调用1秒?”,这是答案时提出的问题(实际上答案是在原始的7分钟内给出的题 :-))。 当时没有给出关于语言的信息,所以请不要犹豫是否正确使用睡眠方式我XCode缺少类...