将来的に3つの小さなイベントをスケジュールし、それぞれに関数を作成する必要はありません。 NSTimer
を使用してこれを行うにはどうすればよいですか?ブロックは匿名関数を容易にすることを理解していますが、NSTimer
内で使用できますか?
[NSTimer scheduledTimerWithTimeInterval:gameInterval
target:self selector:@selector(/* I simply want to update a label here */)
userInfo:nil repeats:NO];
実際に呼び出すことができます:
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)
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.
});
お役に立てれば。
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バージョンをターゲットにする必要がある場合は、他のソリューションのいずれかを使用する必要があります。
@Peter PengのObjective-Cバージョンの回答:
_actionDelayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[NSBlockOperation blockOperationWithBlock:^{
NSLog(@"Well this is useless.");
}] selector:@selector(main) userInfo:nil repeats:YES];
とても簡単ですが、Appleフレームワークにはまだ含まれていません。
NSTimer
のブロックベースのラッパーを自分で書くことができます。 [〜#〜] gcd [〜#〜] を使用するか、次のような既存のサードパーティライブラリを使用できます。 https://github.com/jivadevoe/NSTimer-Blocks 。
NSTimer witchでカテゴリを作成して、ブロックで使用できるようにしました。
このハック@ Peter-Pangが大好き!! BlockOperationはオンザフライで作成され、それ自体が実行キューによって所有されるTimerによって所有され、それを実行するためにブロックのメインセレクターを呼び出します。
_Swift 3
_用に更新
Timer.scheduledTimer(timeInterval: 1, target: BlockOperation { // ... }, selector: #selector(Operation.main), userInfo: nil, repeats: false)