iPhone dev - executeSelector: withObject: afterDelay или NSTimer?
Чтобы повторить вызов метода (или отправить сообщение, я думаю, соответствующий термин) каждыйx секунд, лучше ли использовать NSTimer (запланированный NSTimerTimerWithTimeInterval: target: selector: userInfo: repeats :) или чтобы метод рекурсивно вызывал себя в конце (используя executeSelector: withObject: afterDelay)? Последний не использует объект, но, возможно, он менее понятен / читабелен? Кроме того, просто для того, чтобы дать вам представление о том, что я делаю, это просто представление с меткой, которая ведет обратный отсчет до 12:00 в полночь, а когда она достигает 0, она будет мигать временем (00:00:00). и играть звуковой сигнал навсегда.
Благодарю.
Изменить: также, что было бы лучшим способом повторно играть SystemSoundID (навсегда)? Изменить: я в конечном итоге использовал это, чтобы играть SystemSoundID навсегда:
// 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
Кажется, работает нормально .. И для мигания этикетки я буду использовать NSTimer, я думаю.