83

(同じ) 関数の 2 行の実行の間に遅延を追加する必要があります。これを行うための有利なオプションはありますか?

注:これを行うために 2 つの異なる関数は必要ありません。また、遅延が他の関数の実行に影響を与えてはなりません。

例えば:

line 1: [executing first operation];

line 2: Delay                        /* I need to introduce delay here */

line 3: [executing second operation];

どんな助けもかなりのものです。前もって感謝します...

4

7 に答える 7

224

別のメソッドを作成することなく、gcd を使用してこれを行うことができます

// ObjC

NSTimeInterval delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
  NSLog(@"Do some work");
});

// Swift

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    print("Do some work)
}

多くの場合、コードが複雑になり、競合状態が発生する可能性があるため、「本当に遅延を追加する必要があるか」を自問する必要があります。

于 2013-03-11T10:12:33.090 に答える
22

この行は、3秒後にセレクターsecondMethodを呼び出します。

[self performSelector:@selector(secondMethod) withObject:nil afterDelay:3.0 ];

希望の遅延で2回目の操作に使用します。コードがたくさんある場合は、それを独自のメソッドに配置し、。を使用してそのメソッドを呼び出しますperformSelector:。UIをブロックすることはありませんsleep

編集: 2番目のメソッドが必要ない場合は、performSelectorでブロックを使用できるようにカテゴリを追加できます。

@implementation NSObject (PerformBlockAfterDelay)

- (void)performBlock:(void (^)(void))block 
          afterDelay:(NSTimeInterval)delay
{
    block = [block copy];
    [self performSelector:@selector(fireBlockAfterDelay:) 
               withObject:block 
               afterDelay:delay];
}

- (void)fireBlockAfterDelay:(void (^)(void))block
{
    block();
}

@end

またはおそらくもっときれい:

void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void))
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay),
      dispatch_get_current_queue(), block);
}
于 2013-03-11T10:02:33.983 に答える
8

ターン制のゲームがいくつかあり、AI がターンを開始する前 (およびターンのステップ間) に一時停止する必要があります。遅延が最善の解決策である、より有用な状況が他にもあると確信しています。スウィフトの場合:

        let delay = 2.0 * Double(NSEC_PER_SEC) 
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
        dispatch_after(time, dispatch_get_main_queue()) { self.playerTapped(aiPlayView) }

ここに戻ってきて、Objective-C 呼び出しが異なるかどうかを確認しました (これも追加する必要があります)。

于 2014-08-13T23:34:38.473 に答える
4

iOS 4.0 以降をターゲットにしている場合は、次の操作を実行できます。

[executing first operation];
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [executing second operation];
});
于 2013-03-11T10:16:31.883 に答える