web-dev-qa-db-ja.com

匿名関数/ブロック付きのNSTimer?

将来的に3つの小さなイベントをスケジュールし、それぞれに関数を作成する必要はありません。 NSTimerを使用してこれを行うにはどうすればよいですか?ブロックは匿名関数を容易にすることを理解していますが、NSTimer内で使用できますか?

[NSTimer scheduledTimerWithTimeInterval:gameInterval  
         target:self selector:@selector(/* I simply want to update a label here */) 
         userInfo:nil repeats:NO];
42
Chris

実際に呼び出すことができます:

NSTimer.scheduledTimerWithTimeInterval(ti: NSTimeInterval,
                    target: AnyObject, 
                    selector: #Selector, 
                    userInfo: AnyObject?, 
                    repeats: Bool)

次のように使用します。

NSTimer.scheduledTimerWithTimeInterval(1, 
                    target: NSBlockOperation(block: {...}), 
                    selector: #selector(NSOperation.main), 
                    userInfo: nil, 
                    repeats: true)
26
Peter Peng

NSTimerに似たものを実現し、実行をブロックする場合は、dispatch_afterを使用できます。

同じもののサンプルコードを次に示します。

    int64_t delayInSeconds = gameInterval; // Your Game Interval as mentioned above by you

    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        // Update your label here. 

    });

お役に立てれば。

56
Reno Jones

CocoaにはブロックベースのタイマーAPIがあります (iOS 10以降/ macOS 10.12以降)– Swift 3:

Timer(timeInterval: gameInterval, repeats: false) { _ in
    print("herp derp")
}

…またはObjective-Cの場合:

[NSTimer scheduledTimerWithTimeInterval:gameInterval repeats:NO block:^(NSTimer *timer) {
    NSLog(@"herp derp");
}];

IOS10、macOS 12、tvOS 10、watchOS 3より古いOSバージョンをターゲットにする必要がある場合は、他のソリューションのいずれかを使用する必要があります。

17
mz2

@Peter PengのObjective-Cバージョンの回答:

_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Well this is useless.");
}] selector:@selector(main) userInfo:nil repeats:YES];
9
William Denniss

とても簡単ですが、Appleフレームワークにはまだ含まれていません。

NSTimerのブロックベースのラッパーを自分で書くことができます。 [〜#〜] gcd [〜#〜] を使用するか、次のような既存のサードパーティライブラリを使用できます。 https://github.com/jivadevoe/NSTimer-Blocks

6
coverback

NSTimer witchでカテゴリを作成して、ブロックで使用できるようにしました。

https://github.com/mBrissman/NSTimer-Block

3
mBrissman

2018年後半には、次のように正確に実行します。

Timer.scheduledTimer(withTimeInterval: 0.25, repeats: true) { timer in
  print("no, seriously, this works on iPhone")
} 

@JohnnyCに感謝します!

本当に奇妙だ!

enter image description here

2
Fattie

このハック@ Peter-Pangが大好き!! BlockOperationはオンザフライで作成され、それ自体が実行キューによって所有されるTimerによって所有され、それを実行するためにブロックのメインセレクターを呼び出します。

_Swift 3_用に更新

Timer.scheduledTimer(timeInterval: 1, target: BlockOperation { // ... }, selector: #selector(Operation.main), userInfo: nil, repeats: false)

0
Hugues BR