メソッド呼び出しを1秒間遅延させる簡単な方法はありますか?
私が持っているUIImageView
タッチイベントに反応することを。タッチが検出されると、アプリでアニメーションが発生します。1秒後、別のメソッドを呼び出します。この場合、animationDidStop
セレクターを使用できません。
メソッド呼び出しを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(...
良いオプションかもしれません。
dispatch_after
を開始して
dispatch_after
はを入力するとこれをオートコンプリートします。これは実際には非常に簡単な方法です。さらに、呼び出すメソッドにプロパティを渡すことができるので、すばらしいです。
最善の方法は次のとおりです。
[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 ];
あなたもすることができます:
[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(); });
}
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>)
注:これにより、1つのメソッドだけでなく、スレッド全体が一時停止します。
メソッドを呼び出す直前に、スリープ/待機/停止を1000ミリ秒呼び出しますか?
Sleep(1000); // does nothing the next 1000 mSek
Methodcall(params); // now do the real thing
編集:上記の回答は、一般的な質問「メソッドの呼び出しを1秒間遅らせるにはどうすればよいですか?」に適用されます。これは、回答時に質問された質問です(元の質問から7分以内に回答が与えられた場合:- ))。当時、言語に関する情報は提供されていなかったので、クラスの欠如やスリープi XCodeの適切な使用方法についての愚痴をやめてください...