0

これが私のシナリオです....

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 は私にとって新しい概念なので、実装方法についてのガイダンスが役立ちます。いくつかのリファレンス ガイドを読みましたが、シナリオのコンテキストでサンプル コードを確認する必要があります。ここで私が求めているのは、私のコードのどの部分がブロックに入るでしょうか?

4

2 に答える 2

0

ああ、とにかくタイマーを無効にします... 3回試行した後。すべて -- X タイマーには X カウンターが必要です。X タイマーには 1 つのカウンターがあります。

1 つの長い ledIntervalCount の代わりに、ledIntervalCounts を持つ NSMutableArray を用意してください! タイマーごとに 1 つ

次に、タイマーの userInfo で、使用するカウンターのインデックスを指定します。

于 2013-02-10T21:00:32.380 に答える
0

問題は、オートリリースでラップされたメソッド内からクラスを呼び出していたことです。これをメインスレッドで実行すると、正常に動作します。

于 2014-01-10T08:48:26.353 に答える