NSTimer+Pausing.h
#import <Foundation/Foundation.h>
@interface NSTimer (Pausing)
- (NSMutableDictionary *)pauseDictionary;
- (void)pause;
- (void)resume;
@end
NSTimer+Pausing.m
#import "NSTimer+Pausing.h"
NSString *kIsPausedKey = @"IsPaused Key";
NSString *kRemainingTimeIntervalKey = @"RemainingTimeInterval Key";
@implementation NSTimer (Pausing)
- (NSMutableDictionary *)pauseDictionary {
static NSMutableDictionary *globalDictionary = nil;
if(!globalDictionary)
globalDictionary = [[NSMutableDictionary alloc] init];
if(![globalDictionary objectForKey:[NSNumber numberWithInt:(int)self]]) {
NSMutableDictionary *localDictionary = [[[NSMutableDictionary alloc] init] autorelease];
[globalDictionary setObject:localDictionary forKey:[NSNumber numberWithInt:(int)self]];
}
return [globalDictionary objectForKey:[NSNumber numberWithInt:(int)self]];
}
- (void)pause {
if(![self isValid])
return;
NSNumber *isPausedNumber = [[self pauseDictionary] objectForKey:kIsPausedKey];
if(isPausedNumber && YES == [isPausedNumber boolValue])
return;
NSDate *now = [NSDate date];
NSDate *then = [self fireDate];
NSTimeInterval remainingTimeInterval = [then timeIntervalSinceDate:now];
[[self pauseDictionary] setObject:[NSNumber numberWithDouble:remainingTimeInterval] forKey:kRemainingTimeIntervalKey];
[self setFireDate:[NSDate distantFuture]];
[[self pauseDictionary] setObject:[NSNumber numberWithBool:YES] forKey:kIsPausedKey];
}
- (void)resume {
if(![self isValid])
return;
NSNumber *isPausedNumber = [[self pauseDictionary] objectForKey:kIsPausedKey];
if(!isPausedNumber || NO == [isPausedNumber boolValue])
return;
NSTimeInterval remainingTimeInterval = [[[self pauseDictionary] objectForKey:kRemainingTimeIntervalKey] doubleValue];
NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:remainingTimeInterval];
[self setFireDate:fireDate];
[[self pauseDictionary] setObject:[NSNumber numberWithBool:NO] forKey:kIsPausedKey];
}
@end
分享到:
相关推荐
`NSTimer`本身没有直接的暂停和恢复方法,但可以通过`timer.invalidate()`来取消定时器,然后在需要时重新创建或重新激活。若想实现暂停功能,可以保留定时器引用,然后在暂停时将其失效,恢复时再重新激活。 3. *...
- **暂停与恢复**:`NSTimer`提供了`invalidate`方法来取消定时器,如果你想暂时停止定时器,需要调用此方法,并在需要时重新激活。 - **线程**:`NSTimer`在主线程上运行时,回调方法也会在主线程执行。如果需要在...
4. **使用 `scheduledTimerWithTimeInterval`**:直接将定时器添加到RunLoop中,这样在cell被复用或销毁时,RunLoop会自动处理定时器的暂停和恢复。 5. **追踪已启动的定时器**:为了更精确地控制,可以创建一个...
虽然`NSTimer`没有直接提供暂停与恢复的方法,但可以通过以下方式间接实现: - **暂停**:在需要暂停时,调用`invalidate()`方法; - **恢复**:重新创建一个新的定时器,并调整`timeInterval`以补偿暂停的时间。 ...
在iOS开发中,实现时间条动画的实时暂停和恢复是一个常见的需求,特别是在游戏或计时应用中。这个源码项目“TimeCountDemo_simple_version.zip”提供了这样一个功能的示例。让我们详细探讨一下其中涉及的关键技术和...
- 另一种方法是利用CADisplayLink,它可以与屏幕刷新同步,暂停时取消引用,恢复时重新添加。 4. **UI更新**: - 在iOS中,非主线程不能直接修改UI元素,因此倒计时更新UI的操作必须在主线程上进行。可以使用`...
3. **KVO(Key-Value Observing)**:为了实时响应暂停和恢复操作,开发者可能会使用KVO来监听倒计时状态的变化,一旦状态改变,相应地停止或恢复NSTimer。 4. **GCD(Grand Central Dispatch)**:在处理定时器或...
这个“IOS应用源码Demo-续:游戏倒计时动画Demo-实现时间条动画的实时暂停和恢复-毕设学习.zip”文件提供了一个实际案例,帮助开发者学习如何在iOS应用中创建一个具有暂停和恢复功能的时间条动画。 首先,我们来...
本示例项目"NSTimer 定时器示例"旨在深入讲解如何创建、控制和管理`NSTimer`,包括立刻启动、暂停、继续和停止定时器的功能。 首先,我们了解`NSTimer`的基本概念。`NSTimer`不是线程安全的,它通常在应用程序的...
注意:在实际项目中,通常还需要处理`NSTimer`的暂停、恢复和销毁操作,以适应用户交互或节省系统资源。例如,当应用进入后台时,应暂停`NSTimer`,回到前台时恢复。同时,确保在不再需要倒计时时,调用`[theTimer ...
最后,当定时器触发时,我们需要暂停或恢复 `UIScrollView` 的滚动(如果正在手动滚动),防止冲突。同时,确保在不再需要定时器时调用 `invalidate` 方法来停止它,以避免内存泄漏。 总之,这个项目结合了 `...
- 控制动画暂停的逻辑,可能涉及到CADisplayLink或NSTimer的暂停和恢复。 - 实现暂停和恢复功能的方法,例如`pauseAnimation`和`resumeAnimation`。 - 可能会有专门的类或结构体来管理动画状态。 学习这个源代码...
与`NSTimer`相比,`Repeat`的优势在于其易用性、可读性和低耦合度。它减少了因为不熟悉`NSTimer`API而导致的潜在错误,同时使代码更加整洁。对于那些追求代码质量和开发效率的Swift开发者来说,`Repeat`是一个值得...
这个"游戏倒计时动画_ios源码"是实现这种功能的一个示例项目,名为TimeCountDemo,它包含了时间条动画的实时暂停和恢复功能。 首先,我们来理解一下倒计时动画的基本原理。倒计时动画通常是通过计算剩余时间并将其...
在某些场景下,可能需要临时停止定时任务,比如用户暂停游戏或者应用进入后台,然后再恢复任务。NSTimer本身并不直接提供这样的操作,而XTimer提供了这些高级功能,使得开发者能够更加灵活地控制定时任务的执行状态...
为避免这种情况,我们需要在离开界面时暂停定时器,并在返回时恢复: ```swift - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [_timer invalidate]; // 停止定时器 } - ...
5. **管理工具**:可能提供了一套管理工具,方便暂停、恢复、清除定时器集合等操作。 通过查看"Timer-master"这个压缩包,我们可以预期其中包含源码、示例项目和可能的文档,帮助开发者更好地理解和使用这个封装库...
在这个过程中,通常会结合使用NSTimer来实现自动滚动效果,并且在用户进行手动拖动时暂停滚动,用户停止操作后恢复自动滚动。 首先,我们需要创建一个UIScrollView,并设置其contentSize,使得内容的宽度或高度大于...
2. **生命周期管理**: 使用NSTimer时,需要注意其生命周期与引用计数的关系。为了避免内存泄漏,当不再需要倒计时的时候,需要取消定时器(调用`invalidate`方法)。 3. **线程调度**: 倒计时通常在主线程上进行,...
在iOS开发中,遇到的一个常见问题是当应用进入后台后,基于`NSTimer`的计时器可能会暂停或者计数不准确。这是因为`NSTimer`在应用进入后台时默认会被暂停,以节省系统资源。为了解决这个问题,我们需要采用特殊策略...