NSTimer没有调用方法

10

我有一个 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
 .......

1
这跟Xcode没有任何关系。 - user529758
4个回答

23

使用其中任一个

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];

从文档在运行循环中安排定时器


Swift 代码

要么

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)

哦...我一定是在Xcode的建议中选择了错误的方法。我本意是要调用第二个方法。 - sinθ
我也做过这件事,并且我多次看到了相同的问题。 - progrmr

6
你的问题是使用timerWithTimeInterval:target:selector:userInfo:repeats:时,生成的计时器不会自动添加到运行循环中。我建议使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:代替,它会为您执行此步骤。
如果你更喜欢使用timerWithTimeInterval:target:selector:userInfo:repeats:,那么你需要手动将计时器添加到当前运行循环中。为此,请调用NSRunLoopaddTimer:forMode:方法。文档
[[NSRunLoop currentRunLoop] addTimer:tTimer forMode: NSDefaultRunLoopMode];

2

您需要停止计时器。

您可以通过将其添加到线程中来完成:

NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(fadeManager:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

或者调用
[timer fire];

1

您可以使用:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接