要重复的方法调用(或消息发送,我想适当的术语是)每 X 秒,是它更好地使用一个NSTimer(的NSTimer的scheduledTimerWithTimeInterval:目标:选择器:USERINFO:重复: ),或者为具有该方法递归地调用自身的端部(使用performSelector:withObject:afterDelay)?后者不使用对象,但也许它的不清晰/可读性?此外,只给你的我在做什么,与倒计时至午夜12时,并且当它到达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服务,直到完成。所以你的代码做什么,直到网络调用返回,则下一批被发送出去,直到没有更多的数据还有待发送的代码不会再次调用自身的每次调用可能需要一些时间未知量。

由于应用程序依赖于时间精度(即,它需要执行每秒一次),则的NSTimer会更好。它需要一定的时间的方法本身来执行,和一个NSTimer将罚款与(只要你的方法需要小于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];
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top