我想编写一个创建多个 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/