有没有一种简单的方法可以将方法调用延迟1秒钟?
我有一个 UIImageView,它对触摸事件有反应。当触摸被检测到时,一些动画会在应用程序中发生。一秒钟之后,我想调用另一个方法。在这种情况下,我不能使用 animationDidStop选择器。
UIImageView
animationDidStop
注意: 这将暂停整个线程,而不仅仅是一个方法。 在调用方法之前调用 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(...也可能是一个不错的选择。
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元素)。
dispatch_after
Code Snippet Library
UI
因此,您只需要通过编写 调度中心代码来调用这个代码片段:
在已检查的解决方案中有一个 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
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>)