2010-06-21 4 views
0

J'ai un simple UIButton qui, une fois cliqué, joue un son d'une seconde. Je veux être capable de cliquer sur ce bouton très rapidement et de produire ce son autant de fois que je le peux humainement.Temps de réponse pour un UIButton pour une application iPad

J'ai actuellement ceci en fonctionnement en incluant le et peut-être c'est où le coupable est ... aussi, je creuse dans les références d'Apple et ne peux pas trouver l'information pour combien UIButton est rapide pour répondre à chaque événement et comment, si du tout, je peux contrôler et manipuler cette valeur. Devrais-je passer à un cadre audio différent comme la «boîte à outils audio» ou y a-t-il un moyen pour moi d'accélérer les choses ou d'ordonner à un bouton d'accepter une 2e et une 3e pression alors que l'action de la première pression toujours en cours.

bravo!

~ nir.

Répondre

0

Créez une méthode pour lire le son séparément de la méthode du gestionnaire de boutons. Disons que vous l'appelez playSound. Dans votre gestionnaire de bouton, exécuter cette méthode en arrière-plan:

[self performSelectorInBackground:@selector(playSound) withObject:nil]; 

Cela n'entraîne une charge supplémentaire pour se reproduire hors un fil avant de pouvoir jouer le son. Si vous voulez accélérer un peu plus, créer un pool de threads de travail et de l'utilisation:

[self performSelector:@selector(playSound) 
      onThread:nextThread 
      withObject:nil 
     waitUntilDone:NO]; 

Pour créer le pool de threads de travail:

-(void)stillWorking { 
    NSLog(@"Still working!"); 
} 

-(void)workerThreadMain { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    NSTimer *threadTimer = [NSTimer scheduledTimerWithTimeInterval:10 
                  target:self 
                  selector:@selector(stillWorking) 
                  userInfo:nil 
                  repeats:YES]; 

    [[NSRunLoop currentRunLoop] addTimer:threadTimer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 

    [pool drain]; 
} 

-(NSArray*)createWorkerThreads { 
    NSMutableArray *threadArray = [[[NSMutableArray alloc] initWithCapacity:10]autorelease]; 
    NSThread *workerThread; 

    for (i=0;i<10;i++) { 
     workerThread = [[NSThread alloc]initWithTarget:self 
               selector:@selector(workerThreadMain) 
               object:nil]; 
     [workerThread start]; 
     [threadArray addObject:workerThread]; 
    } 
    return [NSArray arrayWithArray:threadArray]; 
} 

(Ce code est non testé et peut nécessiter un peu de débogage, mais cela devrait vous aider à aller dans la bonne direction.)

+0

thanx john. J'ai essayé la première solution que vous m'aviez offerte et l'intervalle entre les sons est plus lent qu'avant. pour tester les choses, j'ai attaché un son de 5 secondes sur le bouton et essayé de cliquer dans un intervalle de 2-3 secondes, s'attendant à ce que les sons se chevauchent - eh bien - ils ne le font pas. le bouton attend toujours que le premier son se termine même si j'ai séparé le contrôle de l'appel de la méthode de lecture. avant de me lancer et de me plonger dans le fil de travail - que pensez-vous de ce résultat? pourquoi le bouton n'autorise-t-il pas plus d'un fil à fourcher? merci encore! –

+0

S'il n'y a pas de chevauchement des sons, je suppose que l'appel à jouer le son attend que les appels précédents soient terminés en premier. –

Questions connexes