メソッド呼び出しを1秒間遅らせる簡単な方法はありますか?
タッチイベントに反応するUIImageView
があります。タッチが検出されると、アプリでいくつかのアニメーションが発生します。 1秒後に、別のメソッドを呼び出したいです。この場合、animationDidStop
セレクターを使用できません。
performSelector:withObject:afterDelay:
ブロックを使用することもできます
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[object method];
});
ほとんどの場合、dispatch_get_main_queueを使用しますが、メソッドにUIがない場合は グローバルキュー を使用できます。
編集:
Swift 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パラメーターとしてnilを渡すこともできます。
例:
[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];
すでに多くの答えがあり、それらはすべて正しいです。 dispatch_after
を使用する場合は、右下のCode Snippet Library
(UI
要素を選択できる)内に含まれるスニペットを探してください。
したがって、コードでdispatchと記述することにより、このスニペットを呼び出す必要があります。
これを行うために、0.1秒の遅延メソッドが次のコードに対して呼び出された後に、performセレクターを使用できます。
[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 ];
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)
}
チェックされたソリューションからSwift 3ソリューションがあります:
self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)
そして、方法があります
@objc fileprivate func targetMethod(){
}
Swift 3で使用
perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)