iPhone devの - performSelector:withObject:afterDelayまたはNSTimer?
-
18-09-2019 - |
質問
(私は適切な用語があると思い、送信またはメッセージ)メソッドの呼び出しを繰り返して、すべてのの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];
}