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)
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(...也可能是一个不错的选择.
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)
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)
你也可以:
[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)
你可以这样做
[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];
Run Code Online (Sandbox Code Playgroud)
斯威夫特 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)
| 归档时间: |
|
| 查看次数: |
164256 次 |
| 最近记录: |