質問

(私は適切な用語があると思い、送信またはメッセージ)メソッドの呼び出しを繰り返して、すべてののX の秒、それはNSTimer(NSTimerのscheduledTimerWithTimeInterval使用することをお勧めし:ターゲットを:セレクタ:のUserInfo:繰り返し: )またはメソッドが再帰的にperformSelectorを使用して(最後に自分自身を呼び出しました: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を使用します点滅します。

役に立ちましたか?

解決

タイマーは、厳密に定義された間隔に、より適しています。あなたの機能を持っている場合は、時間間隔にの同期のが本当に<全角>ではないので、遅延して自分自身を呼び出す精度を失うことになります。間隔を出すだけでなく、実際のメソッド自体を実行するのにかかる時間は常にあります。

NSTimerに固執する、私が言うと思います。

他のヒント

ただ、他の回答にビットを追加するには、再帰呼び出しのためのケースは、コールが時間の未知の量がかかる可能性がある場合だろう - あなたが終了するまで、あなたは、少量のデータで繰り返しWebサービスを呼び出していると言います。あなたは、コードを持っているので、各呼び出しは、時間のいくつかの未知の量がかかる場合があり、ウェブコールが戻るまで何もしない、それ以上のデータが送信されると、コードは再び自分自身を呼び出すことはありませんなくなるまで、次のバッチが送出されます。

アプリケーションが時間精度に依存するため、

(すなわち、それは1秒に1回実行する必要がある)、NSTimerが良いだろう。 (それは毎秒呼ばれていた場合、あなたの方法は、1秒未満を取る限り)それは、メソッド自体を実行するにはある程度の時間がかかり、かつNSTimerはそれでいいと思います。

を繰り返し、サウンドを再生するには、完了コールバックを設定し、そこに音を再生することができます:

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];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top