iPhone dev - performSelector: withObject: afterDelay oder NSTimer?

Um einen Methodenaufruf zu wiederholen (oder eine Nachricht zu senden, denke ich, der entsprechende Begriff ist), jedenx Sekunden, ist es besser, einen NSTimer zu verwenden (NSTimers ScheduledTimerWithTimeInterval: Target: Selector: UserInfo: Repeats :) oder sich die Methode am Ende rekursiv selbst aufrufen zu lassen (mit PerformSelector: WithObject: AfterDelay)? Letzterer benutzt kein Objekt, aber vielleicht ist es weniger klar / lesbar? Nur um Ihnen eine Vorstellung davon zu geben, was ich tue. Es ist nur eine Ansicht mit einem Etikett, das bis Mitternacht um 12:00 Uhr herunterzählt. Wenn es auf 0 geht, blinkt die Zeit (00:00:00). und spielen Sie einen Piepton für immer.

Vielen Dank.

Bearbeiten: auch, was wäre der beste Weg, um eine SystemSoundID (für immer) wiederholt zu spielen? Bearbeiten: Ich endete damit, die SystemSoundID für immer zu spielen:

// 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

Scheint gut zu funktionieren. Und für das blinkende Etikett verwende ich einen NSTimer, denke ich.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage