Pour répéter un appel de méthode (ou envoyer un message, je suppose que le terme approprié est) toutes les x secondes, est-il préférable d'utiliser un NSTimer (NSTimer's scheduledTimerWithTimeInterval: target: selector: userInfo: répète :) ou d'avoir la méthode s'appelle récursivement à la fin (en utilisant performSelector: withObject: afterDelay)? Ce dernier n'utilise pas d'objet, mais peut-être est-il moins clair/lisible? Aussi, juste pour vous donner une idée de ce que je fais, c'est juste une vue avec une étiquette qui compte jusqu'à minuit, et quand elle arrive à 0, elle clignotera l'heure (00:00:00) et jouez un bip sonore pour toujours.iPhone dev - performSelector: avecObjet: afterDelay ou NSTimer?
Merci.
Editer: aussi, quelle serait la meilleure façon de jouer à plusieurs reprises un SystemSoundID (pour toujours)? Edit: Je fini par utiliser ceci pour jouer le SystemSoundID pour toujours:
// Utilities.h
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioServices.h>
static void soundCompleted(SystemSoundID soundID, void *myself);
@interface Utilities : NSObject {
}
+ (SystemSoundID)createSystemSoundIDFromFile:(NSString *)fileName ofType:(NSString *)type;
+ (void)playAndRepeatSystemSoundID:(SystemSoundID)soundID;
+ (void)stopPlayingAndDisposeSystemSoundID;
@end
// Utilities.m
#import "Utilities.h"
static BOOL play;
static void soundCompleted(SystemSoundID soundID, void *interval) {
if(play) {
[NSThread sleepForTimeInterval:(NSTimeInterval)interval];
AudioServicesPlaySystemSound(soundID);
} else {
AudioServicesRemoveSystemSoundCompletion(soundID);
AudioServicesDisposeSystemSoundID(soundID);
}
}
@implementation Utilities
+ (SystemSoundID)createSystemSoundIDFromFile:(NSString *)fileName ofType:(NSString *)type {
NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:type];
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
return soundID;
}
+ (void)playAndRepeatSystemSoundID:(SystemSoundID)soundID interval:(NSTimeInterval)interval {
play = YES
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL,
soundCompleted, (void *)interval);
AudioServicesPlaySystemSound(soundID);
}
+ (void)stopPlayingAndDisposeSystemSoundID {
play = NO
}
@end
semble fonctionner très bien .. Et pour l'étiquette clignote, je vais utiliser un NSTimer je suppose.
Ceci est utile pour contraster les deux méthodes. –