我有一个NSTimer应该每秒调用一个方法,但它似乎根本没有调用它。
这是我宣布计时器的方式:
[NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
这是它所调用的方法:
-(void) fadeManager: (NSTimer*) timer{
NSLog(@"IT'S WORKING!");
self.playHead += .1; // keeps track of where they are in full track
if (self.playHead >= self.wait && ![player isPlaying]) { // checks if wait is over
[player play];
}
if (self.playHead >= self.duration + self.startTime && [player isPlaying]) { // checks if full duration is over
[player pause];
[self reset];
}
int fadeOutArea = self.startTime + self.duration - self.fadeOut;
int fadeInArea = self.startTime + self.fadeIn;
if (self.playHead <= fadeInArea && [player volume] < relativeVolume) { // checks if fadingIn.
[self fadeInIncriment];
}
if (self.playHead >= fadeOutArea && [player volume] > 0) {
[self fadeOutIncriment];
}
}
代码没有工作,所以我把NSLog和断点都放在了一起。似乎永远不会被召唤。为什么是这样?我在.m文件中声明方法是否重要:
#import <AVFoundation/AVFoundation.h>
@interface CueMusic ()
- (void) delayFadeOut: (AVAudioPlayer*) dFade;
- (void) fadeInIncriment;
- (void) fadeOutIncriment;
- (void) fadeManager: (NSTimer*) timer; // <--------
- (void) start;
@end
@implementation CueMusic
.......
答案 0 :(得分:20)
使用
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
或
//schedules the timer
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
使用
scheduledTimerWithTimeInterval:invocation:repeats:
或scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
类方法创建计时器,并在默认模式下在当前运行循环上安排计时器。使用
timerWithTimeInterval:invocation:repeats:
或timerWithTimeInterval:target:selector:userInfo:repeats:
类方法创建计时器对象,而无需在运行循环上进行计划。 (创建它之后,必须通过调用相应NSRunLoop对象的addTimer:forMode:方法手动将计时器添加到运行循环中。)
无论
let timer: NSTimer = NSTimer(timeInterval: 1.0, target: self, selector: "fadeManager:", userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
或者
//schedules the timer
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "fadeManager:", userInfo: nil, repeats: true)
答案 1 :(得分:6)
您的问题是,在使用timerWithTimeInterval:target:selector:userInfo:repeats:
时,生成的计时器不会自动添加到运行循环中。我建议改为使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
,它会为您执行此步骤。
如果您更喜欢使用timerWithTimeInterval:target:selector:userInfo:repeats:
,则需要手动将计时器添加到当前运行循环中。为此,请调用NSRunLoop
的{{1}}方法。 Documentation
addTimer:forMode:
答案 2 :(得分:2)
你需要开启计时器。
您可以通过将其添加到线程来实现:
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
或致电
[timer fire];
答案 3 :(得分:1)
您可以使用:
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];