これが私のシナリオです....
Note On および Note Off メッセージを検出する Core MIDI アプリがうまく機能しています。
メッセージをコントローラに送り返して LED を点灯させる midiSend メソッドがいくつかありますが、これも正常に動作しています。
私が今やりたいことは、ノートオフメッセージで LED を点滅させたり消したりすることです。これは私のコードです:
[midiListener performSelectorOnMainThread:@selector(startTimer:) withObject:midiMsgParts waitUntilDone:YES];
-(void)startTimer:(NSDictionary *)dict {
ledIntervalCount = 0;
ledIntervalTimer = [NSTimer scheduledTimerWithTimeInterval:0.3
target:self
selector:@selector(ledIntervalLoop:)
userInfo:dict
repeats:YES];
}
-(void)ledIntervalLoop:(NSTimer *)inboundTimer{
NSDictionary *userInfo = [NSDictionary dictionaryWithDictionary:[inboundTimer userInfo]];
NSLog(@"%@", userInfo);
UInt32 onCommand = [[userInfo objectForKey:@"noteOn"] intValue];
//UInt32 offCommand = [[userInfo objectForKey:@"noteOff"] intValue];
UInt32 theNote = [[userInfo objectForKey:@"note"] intValue];
ledIntervalCount++;
if (ledIntervalCount > 3) {
[ledIntervalTimer invalidate];
ledIntervalTimer = nil;
} else {
if(ledIntervalCount %2){
[self sendNoteOnIlluminate:onCommand midiNote:theNote];
}else{
[self sendNoteOnCommand:onCommand midiNote:theNote];
}
}
}
NSTimer
そのため、LED のオン/オフ コマンドを交互に使用しています。1 つのボタンを押すと正常に機能しますが、同時に複数のボタンを押すと機能しません。startTimer メソッドへの最後の呼び出しのみを選択するようです。
ここで、GCD でディスパッチ キューを実装する必要があると思います。NSTimer
そのため、後続のメソッド呼び出しによって中断されることなく、それぞれが完全に実行されます。
私は正しいですか?GCD ではNSTimer
同時に実行できますか?
GCD は私にとって新しい概念なので、実装方法についてのガイダンスが役立ちます。いくつかのリファレンス ガイドを読みましたが、シナリオのコンテキストでサンプル コードを確認する必要があります。ここで私が求めているのは、私のコードのどの部分がブロックに入るでしょうか?