0

这是我的场景....

我有一个 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 对我来说是一个新概念,所以一些关于我如何实施它的指导会有所帮助。我已经阅读了一些参考指南,但需要在我的场景上下文中查看一些示例代码。我想我在这里要问的是,我的代码的哪一部分会放在块中?

4

2 回答 2

0

啊,无论如何,您都使计时器无效...在尝试了 3 次之后。ALL - 你需要 X 个计数器用于 X 定时器,你有 1 个计数器用于 X 定时器

而不是一个长的 ledIntervalCount,有一个带有 ledIntervalCounts 的 NSMutableArray!每个计时器一个

然后在计时器的用户信息中,提供要使用的计数器的索引

于 2013-02-10T21:00:32.380 回答
0

问题是我从包装在自动释放的方法中调用该类。我现在在主线程上运行它,它工作正常。

于 2014-01-10T08:48:26.353 回答