Ich habe einen Drum-Sequenzer mit Objective C erstellt. Ich möchte den Schieberegler, um das Tempo zu steuern. Im Moment funktioniert alles, und das Intervall zwischen jedem Schritt kontrolliert wird:iOS Sequenzer Tempo-Schieberegler verursacht App zum Absturz
while (self.running)
{
// sleep until the next step is due
[NSThread sleepUntilDate:time];
// update step
int step = self.step + 1;
// wrap around if we reached NUMSTEPS
if (step >= NUMSTEPS)
step = 0;
// store
self.step = step;
// time duration until next step
time = [time dateByAddingTimeInterval:0.2];
}
zwischen jedem Schritt also die Zeit beträgt 0,2 Sekunden. Ich habe versucht, einen Temporegler wie so im View-Controller .m zu implementieren (der Schieber hat einen Bereich von 0,3 bis 1,0 wird so ausgegeben ähnlicher Wert zu dem, was in der Zeit ist zur Zeit):
- (IBAction)sliderMoved:(UISlider *)sender
{
AppDelegate* app = [[UIApplication sharedApplication] delegate];
app.tempo = sender.value;
}
und durch die sie wandelnde Linie in der while (self.running) Thread zu:
time = [time dateByAddingTimeInterval: (NSTimeInterval) _tempo];
dies ist jedoch die Zeit zwischen den Schritten verursacht viel zu kurz sein (das Tempo ist verrückt schnell) und wenn eine Kontrolle in der App berührt wird, stürzt .
Ich frage mich, ob ich eine Funktion wie diese einrichten müssen, aber ich bin mir nicht sicher, was im Inneren gehen würde den Temporegler zu ermöglichen, zu arbeiten:
- (void)setTempo:(float)tempo
{
}
habe ich versucht, so klar zu sein, wie ich kann, wenn mir jemand helfen kann, wäre ich sehr dankbar, danke im voraus
Wenden Sie die Verzögerung auf einen separaten Thread an, der sich vom Hauptthread unterscheidet? –
Nein, ich denke nicht, es ist im Hauptthread – Neo
Das ist schlecht, nicht nur für iOS, aber im Allgemeinen, diese Art von Aktion, die Sperrvorgang erwarten (in Ihrem Fall, dass Verzögerung) sollte in anderen asynchronen Thread ausgeführt werden. In iOS können Sie GCD (dispatches) oder NSOperation, NSOperationQueue und NSTimer nutzen. In Ihrem Fall könnte der NSTimer die beste Lösung für Sie sein. Ich versuche zu schreiben als mögliche Lösung als Antwort unter –