Dựa tắt @Thiru và @ kapesoftware của câu trả lời, tôi đã tạo một danh mục Mục tiêu-C trên NSTimer sử dụng đối tượng liên kết để tạm dừng và tiếp tục hẹn giờ.
#import <objc/runtime.h>
@interface NSTimer (PausableTimer)
@property (nonatomic, retain) NSDate *pausedDate;
@property (nonatomic, retain) NSDate *nextFireDate;
-(void)pause;
-(void)resume;
@end
...
@implementation NSTimer (PausableTimer)
static char * kPausedDate = "pausedDate";
static char * kNextFireDate = "nextFireDate";
@dynamic pausedDate;
@dynamic nextFireDate;
-(void)pause {
self.pausedDate = [NSDate date];
self.nextFireDate = [self fireDate];
[self setFireDate:[NSDate distantFuture]];
}
-(void)resume
{
float pauseTime = -1*[self.pausedDate timeIntervalSinceNow];
[self setFireDate:[self.nextFireDate initWithTimeInterval:pauseTime sinceDate:self.nextFireDate]];
}
- (void)setPausedDate:(NSDate *)pausedDate
{
objc_setAssociatedObject(self, kPausedDate, pausedDate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSDate *)pausedDate
{
return objc_getAssociatedObject(self, kPausedDate);
}
- (void)setNextFireDate:(NSDate *)nextFireDate
{
objc_setAssociatedObject(self, kNextFireDate, nextFireDate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSDate *)nextFireDate
{
return objc_getAssociatedObject(self, kNextFireDate);
}
Nó giữ mọi thứ gọn gàng và có nghĩa là bạn không cần phải tạo ra các biến dụ hoặc tài sản chỉ để tạm dừng và tiếp tục tính giờ của bạn.
@fishcharlie link bị hỏng – Till