这是我的场景....
我有一个 Core MIDI 应用程序,它可以检测 Note On 和 Note Off 消息,效果很好。
我有一些 midiSend 方法可以将消息发送回控制器以点亮 LED - 也可以正常工作。
我现在要做的是在 Note Off 消息上让 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 开/关命令。当我按下一个按钮时它工作正常,但当我同时按下多个按钮时就不行了。似乎它只选择最后一次调用 startTimer 方法。
这是我认为我需要使用 GCD 实现调度队列的地方。这样每个都NSTimer
将完全执行而不会被随后的方法调用中断。
我对么?GCD 会允许我NSTimer
同时运行吗?
GCD 对我来说是一个新概念,所以一些关于我如何实施它的指导会有所帮助。我已经阅读了一些参考指南,但需要在我的场景上下文中查看一些示例代码。我想我在这里要问的是,我的代码的哪一部分会放在块中?