有没有一种简单的方法延迟的方法调用1秒?
我有一个触摸事件反应的UIImageView
。当检测到触摸,一些动画发生在应用程序。两秒钟后,我想调用另一个方法。在这种情况下,我不能使用animationDidStop
选择。
performSelector:withObject:afterDelay:
在使用雨燕3
perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)
注意:这将暂停你的整个主题,而不仅仅是一种方法。 拨打电话睡觉/等待1000毫秒/停止只是想问你的方法之前?
Sleep(1000); // does nothing the next 1000 mSek
Methodcall(params); // now do the real thing
编辑:上述答案适用于一般的问题:“我怎样才能延缓方法调用1秒?”,这是在回答(INFACT7分钟原题的范围内给出答案的时候问这个问题: - ))。暂无相关信息给出关于当时的语言,所以恳请停止婆妈使用睡眠我的Xcode OG缺乏阶级的正确方法...
你也可以使用块
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[object method];
});
大多数的时候,你会想用dispatch_get_main_queue,但如果在你可以使用一个global queue的方法,没有UI。
编辑:
斯威夫特3版本:
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
object.method()
}
同样,DispatchQueue.global().asyncAfter(...
也可能是一个不错的选择。
做最好的办法是:
[self performSelector:@selector(YourFunctionName)
withObject:(can be Self or Object from other Classes)
afterDelay:(Time Of Delay)];
您也可以通过零作为withObject参数。
例如:
[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];
现在已经有很多答案,他们是正确的。如果你想使用你应该寻找它包括在右下角的dispatch_after
(在这里您可以选择Code Snippet Library
元素)内的片段中的UI
。
所以,你只需要在代码编写调度调用这个片段:
可以使用执行选择器,用于之后的0.1秒的延迟的方法是调用该下面的代码来做到这一点。
[self performSelector:@selector(InsertView) withObject:nil afterDelay:0.1];
你也可以:
[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 ];
斯威夫特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)
}
有从检查溶液中的斯威夫特3的解决方案:
self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)
并且有方法
@objc fileprivate func targetMethod(){
}