2009-09-29 13 views
10

x秒ごとにメソッド呼び出しを繰り返すには、NSTimer(NSTimerのscheduledTimerWithTimeInterval:target:selector:userInfo:repeats :)を使用するか、再帰的に(performSelector:withObject:afterDelayを使用して)最後に自身を呼び出しますか?後者はオブジェクトを使用しませんが、あまり明確でない/読みやすいでしょうか?また、ちょうど私がやっていることのアイデアを与えるために、それはちょうど夜12時までカウントするラベルを持つビューで、0になると時刻(00:00:00)を点滅させます。永遠にビープ音を鳴らします。iPhoneのdev - performSelector:withObject:afterDelayまたはNSTimer?

ありがとうございました。

編集: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を使用します点滅します。

答えて

6

タイマーは、厳密に定義された間隔により適しています。あなたは、実際にはが時間間隔に対してを同期させていないので、あなたが関数呼び出しを遅らせると正確さが失われます。実際のメソッドそのものを実行するのにも時間が必要です。

NSTimerとスティックするといいでしょう。

1

アプリケーションが(すなわち、それは毎秒1回実行する必要がある)時間精度に依存するため、NSTimerは良いだろう。メソッド自体が実行されるまでには時間がかかり、NSTimerはこれで問題ありません(メソッドが1秒未満の場合、1秒ごとに呼び出される場合)。

SystemSoundID tickingSound; 

... 

AudioServicesAddSystemSoundCompletion(tickingSound, NULL, NULL, completionCallback, (void*) self); 

... 

static void completionCallback(SystemSoundID mySSID, void* myself) { 
    NSLog(@"completionCallback"); 

    // You can use this when/if you want to remove the completion callback 
    //AudioServicesRemoveSystemSoundCompletion(mySSID); 

    // myself is the object that called set the callback, because we set it up that way above 
    // Cast it to whatever object that is (e.g. MyViewController, in this case) 
    [(MyViewController *)myself playSound:mySSID]; 
} 
2

をただ、他の回答にビットを追加する際に呼び出し、再帰呼び出しのためのケースは次のようになります。繰り返しサウンドを再生し、あなたは完了コールバックを設定することができ、そこに音を再生するに

あなたが完了するまで少量のデータで繰り返しWebサービスを呼び出しているとします。各呼び出しには何らかの未知の時間がかかるため、Web呼び出しが返るまで何もしないでコードを残しておき、それ以上のデータが送信されなくなり、コードが再び呼び出されなくなるまで次のバッチが送信されます。

+0

これは、2つの方法を対比するのに役立ちます。 –

関連する問題