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

Tha*_*nks 164 iphone cocoa-touch objective-c uikit ios

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

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

Jim*_*Jim 255

performSelector:withObject:afterDelay:
Run Code Online (Sandbox Code Playgroud)

文件参考

  • 这是正确的答案.请参阅http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelector:withObject:afterDelay: (7认同)

mcf*_*edr 192

你也可以使用一个块

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [object method]; 
});
Run Code Online (Sandbox Code Playgroud)

大多数情况下,您将需要使用dispatch_get_main_queue,但如果方法中没有UI,则可以使用全局队列.

编辑:

Swift 3版本:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    object.method()
}
Run Code Online (Sandbox Code Playgroud)

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

  • 更新为使用dispatch_get_main_queue而不是dispatch_get_current_queue (3认同)
  • Xcode现在将自动完成此操作,只需输入`dispatch_after`并按回车即可 (2认同)

Mil*_*noo 127

最好的方法是:

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

你也可以传递nil作为withObject参数.

例如:

[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要把自己传给自己? (3认同)
  • 为什么要将变量传递给接受零参数的方法? (2认同)

Ale*_*Cio 24

已经有很多答案,它们都是正确的.如果你想使用它,dispatch_after你应该寻找包含在Code Snippet Library右下方(你可以选择UI元素)的片段.

在此输入图像描述

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

在此输入图像描述


Nim*_*ekh 17

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

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1]; 
Run Code Online (Sandbox Code Playgroud)


Ger*_*eri 9

你也可以:

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

在这种情况下,您必须对某些视图进行一些更改才能使动画生效.确实是hacky,但我喜欢基于块的东西.或者在下面结束@mcfedr的答案.


waitFor(1.0, ^
{
    NSLog(@"A second lapsed");
});
Run Code Online (Sandbox Code Playgroud)
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(); });
}
Run Code Online (Sandbox Code Playgroud)


Nit*_*esh 7

你可以这样做

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];
Run Code Online (Sandbox Code Playgroud)


Sal*_*ani 5

斯威夫特 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")
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特 3.x ---&--- 斯威夫特 4

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    print("do some work")
}
Run Code Online (Sandbox Code Playgroud)

或通过 escaping closure

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