2016-03-23 7 views
1

Grundsätzlich habe ich ein Array eingerichtet, so dass beim Drücken einer Taste jede Sekunde Werte zurück gegeben werden wurden bereits im Projekt deklariert.Wie man mehrere Sounds nacheinander abspielt, wenn man ein Sequenzarray verwendet, das jede Sekunde eine Zahl zurückgibt

Ich habe vier Sounds in meinem Projekt, die ich anstelle von Zahlenwerten spielen möchte.

Der verwendete Code ist:

- (IBAction)playSeq:(UIButton *)sender 
{ 
    AppDelegate* app = [[UIApplication sharedApplication] delegate]; 
    if (sender.tag == 1001) 
    { 
//  [app addNote:2]; 
//  [app addNote:3]; 
//  [app addNote:2]; 
//  [app addNote:0]; 
//  [app addNote:1]; 

     [app playSeq:@[@2, @3, @3, @0, @1]]; 
    } 
} 

Wo die Funktion playSeq verwendet wird, möchte ich diese Zahlen ersetzen können [@2, @3, @3, @0, @1] mit den Klängen entspricht.

Hat jemand irgendwelche Vorschläge, wie ich das bitte tun könnte? Nicht so einfach, als nur die Nummern durch die Namen meiner Audiodateien zu ersetzen! Vielen Dank!!

Antwort

0

Eine einfache Implementierung des playSeq Methode wie folgt aussehen könnte:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
NSTimeInterval timeDelay = 0.0; 
for (id sound in sounds) { 
    dispatch_time_t dispatchDelay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeDelay * NSEC_PER_SEC)); 
    dispatch_after(dispatchDelay, queue, ^{ 
     // Play the sound in whatever fashion you want 
     [self play:sound]; 
    }); 
} 

Dieses viel Kontrolle nicht geben Sie (wie Cancelling etc.), aber es kann schon für Ihre Bedürfnisse ausreichen .

Wenn nicht, sollten Sie eine benutzerdefinierte NSOperation Unterklasse für die Tonwiedergabeaufgabe verwenden. Geben Sie dieser Klasse entweder eine delay -Eigenschaft, um die Tonwiedergabe zu verzögern, oder erstellen Sie eine weitere NSOperation-Unterklasse, deren einzige Aufgabe es ist, auf eine bestimmte Verzögerung zu warten. Sie könnten dann alle diese Operationen zu einer NSOperationQueue hinzufügen und Abhängigkeiten zwischen den Operationen erstellen, um sie in der Reihenfolge auszuführen.

+0

Gibt es keine Möglichkeit, einfach die (IBAction') zu ändern? Zum Beispiel, wenn du folgendes getan hast: '[app playSeq: playNote1, playNote2, playNote3, playNote4]];'? – hbondy

+0

Nicht leicht. Wenn 'playNote1',' playNote2' usw. Blöcke wären, könnten Sie sicherlich ein Array von Blöcken an eine Methode übergeben, aber dann müssten Sie zuerst die Blöcke erstellen und dann müssten entweder die Blöcke oder die 'playSeq:' Methode funktionieren Behandle die Verzögerung zwischen den Tönen. Sie würden mit etwas enden, das dem oben gezeigten Code ähnelt. –

+0

Okay, ich werde mir dein Beispiel ansehen. Vielen Dank für Ihre Hilfe, ich schätze es sehr! – hbondy