web-dev-qa-db-ja.com

メソッド呼び出しを1秒間遅らせるにはどうすればよいですか?

メソッド呼び出しを1秒間遅らせる簡単な方法はありますか?

タッチイベントに反応するUIImageViewがあります。タッチが検出されると、アプリでいくつかのアニメーションが発生します。 1秒後に、別のメソッドを呼び出したいです。この場合、animationDidStopセレクターを使用できません。

164
Thanks
performSelector:withObject:afterDelay:

ドキュメントリファレンス

254
Jim

ブロックを使用することもできます

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(...も良い選択肢かもしれません。

192
mcfedr

最善の方法は次のとおりです。

[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 ];
126
Milianoo

すでに多くの答えがあり、それらはすべて正しいです。 dispatch_afterを使用する場合は、右下のCode Snippet LibraryUI要素を選択できる)内に含まれるスニペットを探してください。

enter image description here

したがって、コードでdispatchと記述することにより、このスニペットを呼び出す必要があります。

enter image description here

24
Alex Cio

これを行うために、0.1秒の遅延メソッドが次のコードに対して呼び出された後に、performセレクターを使用できます。

[self performSelector:@selector(InsertView)  withObject:nil afterDelay:0.1]; 
17
Nimit Parekh

あなたもすることができます:

[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(); });
}
9
Geri

あなたはこれを行うことができます

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];
7
Nitesh

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)
}
4
Salman Ghumsani

チェックされたソリューションからSwift 3ソリューションがあります:

self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)

そして、方法があります

@objc fileprivate func targetMethod(){

}
1
Kevin ABRIOUX

Swift 3で使用

perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)
0