ios - 具有单独 timeleft 的多个 NSTimer

标签 ios objective-c nstimer

我想编写一个创建多个 NSTimer 的方法(事先不会知道 nstimer 的数量,代码应该是通用的),并且它将调用一个方法作为其选择器,该方法将 timeleft 更新为其文本。基本上是倒计时。 现在对于许多计时器来说,必须存在许多标签,当预先知道计时器 n 标签的数量(相同)时,我已经通过创建那么多 nstimer 及其每个 timeleft 作为实例变量、对象来完成此操作。

但是每个计时器都有自己的剩余时间。 我的问题是 - 是否可以维护多个未知数量的 ntimer 来运行单个方法(所有计时器都调用该方法),其中每个计时器都有其单独的倒计时或剩余时间,即计时器将运行多少次。 如果是这样,逻辑应该是什么。

最佳答案

在“运行”计时器的对象中,保留一个始终运行的计时器对象以及将维护要更新的“timeleft”和“label”实例的自定义对象列表:

LabelTime.h:

@interface LabelTime : NSObject
@property NSTimeInterval timeLeft;
@property UILabel *label;
- (void)decrementTime:(NSTimeInteval)interval;
@end

LabelTime.m:

@interface LabelTime

- (void)decrementTime:(NSTimeInterval)interval {
    NSTimeInterval newTimeLeft = self.timeLeft - interval;
    if (newTimeLeft >= 0.0) {
        self.label.text = [NSString stringWithFormat:@"%d seconds left", (int)newTimeLeft];
        // Only if you want whole numbers              ^^                ^^^^^
    }
    self.timeLeft = newTimeLeft;
}

@end

someclass.m:

#define UPDATE_TIME 1.0

@implementation SomeClass () {
    NSTimer *_timer;
    NSTimeInterval _lastTimeFired;
    NSMutableArray *_labelTimes;     // array of LabelTime objects
}
- (void)_timerFired:(NSTimer *)timer;
@end

在某处初始化它们:

- (id)init {
    self = [super init];
    if (self) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:UPDATE_TIME
                                                  target:self
                                                selector:@selector(_timerFired:)
                                                userInfo:nil
                                                 repeats:YES];
        _lastTimeFired = [[NSDate date] timeIntervalSinceReferenceDate];
        _labelTimes = [NSMutableArray new];
    }
    return self;
}

- (void)_timerFired:(NSTimer *)timer {
    NSTimeInterval now = [[NSDate date] timeIntervalSinceReferenceDate];
    NSTimeInterval interval = _lastTimeFired - now;
    for (LabelTime *labelTime in _labelTimes) {
        [labelTime decrementTime:interval];
    }
    _lastTimeFired = now;
}

注释:

  • 您可能希望“锁定”对 _labelTimes 的读/写访问权限以确保线程安全。

关于ios - 具有单独 timeleft 的多个 NSTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421724/

相关文章:

ios - UIScrollView 在 vi​​ewwillappear 中设置 contentoffset 不起作用

ios - Swift - 在 Spotlight 搜索中获取圆形图像(即在缩略图中)

objective-c - 将文本字段的值放入另一个字符串

ios - Objective-C 中的函数重载?

ios - 检查定时器是否正在运行

ios - 在 UITableviewcell 中加载计时器

ios - 推送新的 View Controller (以编程方式)不起作用?为什么?

iphone - NSDate真的很奇怪

iPhone 应用程序在 "AdHoc"模式下崩溃

iphone - 应用程序在屏幕关闭时不播放声音,但仍按应有的方式执行其他操作?