52

Objective-Cでアクションを遅らせるには、次のようないくつかの方法があることを知っています。

performSelector:withObject:afterDelay:

またはを使用しNSTimerます。

しかし、あなたがこのようなことをすることができるブロックと呼ばれるそのような素晴らしいものがあります:

[UIView animateWithDuration:1.50 delay:0 options:(UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState) animations:^{

    }completion:^(BOOL finished){
}];

残念ながら、この方法はアニメーションにのみ適用されます。

1つのメソッドでブロックを使用して遅延を作成し、それらすべてを使用する必要がなく、新しい別のメソッド@selectorsを作成する必要がないようにするにはどうすればよいですか?ありがとう!

4

4 に答える 4

140

dispatch_afterを使用します:

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    //code to be executed on the main queue after delay
    [self doSometingWithObject:obj1 andAnotherObject:obj2];
});
于 2013-03-14T15:13:09.147 に答える
24

受け入れられた答えを拡張して、私はこれを実行するたびに構文を覚えることを気にしない人のためにヘルパー関数を作成しました:)私は単にこれを備えたUtilsクラスを持っています:

使用法:

[Utils delayCallback:^{
     //--- code here
} forTotalSeconds:0.3];

ヘルパーメソッド:

+ (void) delayCallback: (void(^)(void))callback forTotalSeconds: (double)delayInSeconds{

     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
           if(callback){
                callback();
           }
      });
}
于 2014-03-28T00:47:00.937 に答える
3

Xcode 11.3.1(少なくとも、および他のバージョンのXcode)は、遅延値と遅延後に実行するコードを入力するだけで、これを行うためのコードスニペットを提供します。

  1. +Xcodeの右上にあるボタンをクリックします。
  2. 検索するafter
  3. 目的のスニペットである検索結果が1つだけ返されます(スクリーンショットを参照)。それをダブルクリックすると、準備完了です。

Xcode自体からスニペットを取得する方法を示すスクリーンショット

于 2020-06-18T13:20:24.903 に答える
2

Swiftで遅延した後にブロックをトリガーする方法は次のとおりです。

runThisAfterDelay(seconds: 4) { () -> () in
    print("Prints this 4 seconds later in main queue")
    // Or just call animatedMyObject() right here
}

/// EZSwiftExtensions
func runThisAfterDelay(seconds seconds: Double, after: () -> ()) {
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
    dispatch_after(time, dispatch_get_main_queue(), after)
}

それは私のリポジトリに標準機能として含まれています: https ://github.com/goktugyil/EZSwiftExtensions

于 2015-12-01T22:30:08.860 に答える