`
jsntghf
  • 浏览: 2527397 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

NSTimer的暂停与恢复

    博客分类:
  • iOS
阅读更多

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

    `NSTimer`本身没有直接的暂停和恢复方法,但可以通过`timer.invalidate()`来取消定时器,然后在需要时重新创建或重新激活。若想实现暂停功能,可以保留定时器引用,然后在暂停时将其失效,恢复时再重新激活。 3. *...

    NSTimer定时器

    - **暂停与恢复**:`NSTimer`提供了`invalidate`方法来取消定时器,如果你想暂时停止定时器,需要调用此方法,并在需要时重新激活。 - **线程**:`NSTimer`在主线程上运行时,回调方法也会在主线程执行。如果需要在...

    NSTimer在tableView上的复用

    4. **使用 `scheduledTimerWithTimeInterval`**:直接将定时器添加到RunLoop中,这样在cell被复用或销毁时,RunLoop会自动处理定时器的暂停和恢复。 5. **追踪已启动的定时器**:为了更精确地控制,可以创建一个...

    NSTimer 使用 文档说明

    虽然`NSTimer`没有直接提供暂停与恢复的方法,但可以通过以下方式间接实现: - **暂停**:在需要暂停时,调用`invalidate()`方法; - **恢复**:重新创建一个新的定时器,并调整`timeInterval`以补偿暂停的时间。 ...

    IOS应用源码——实现时间条动画的实时暂停和恢复 TimeCountDemo_simple_version.zip

    在iOS开发中,实现时间条动画的实时暂停和恢复是一个常见的需求,特别是在游戏或计时应用中。这个源码项目“TimeCountDemo_simple_version.zip”提供了这样一个功能的示例。让我们详细探讨一下其中涉及的关键技术和...

    IOS应用源码之续:游戏倒计时动画Demo----实现时间条动画的实时暂停和恢复.zip

    - 另一种方法是利用CADisplayLink,它可以与屏幕刷新同步,暂停时取消引用,恢复时重新添加。 4. **UI更新**: - 在iOS中,非主线程不能直接修改UI元素,因此倒计时更新UI的操作必须在主线程上进行。可以使用`...

    ios应用源码之续:游戏倒计时动画demo----实现时间条动画的实时暂停和恢复 ti

    3. **KVO(Key-Value Observing)**:为了实时响应暂停和恢复操作,开发者可能会使用KVO来监听倒计时状态的变化,一旦状态改变,相应地停止或恢复NSTimer。 4. **GCD(Grand Central Dispatch)**:在处理定时器或...

    IOS应用源码Demo-续:游戏倒计时动画Demo-实现时间条动画的实时暂停和恢复-毕设学习.zip

    这个“IOS应用源码Demo-续:游戏倒计时动画Demo-实现时间条动画的实时暂停和恢复-毕设学习.zip”文件提供了一个实际案例,帮助开发者学习如何在iOS应用中创建一个具有暂停和恢复功能的时间条动画。 首先,我们来...

    NSTimer 定时器示例

    本示例项目"NSTimer 定时器示例"旨在深入讲解如何创建、控制和管理`NSTimer`,包括立刻启动、暂停、继续和停止定时器的功能。 首先,我们了解`NSTimer`的基本概念。`NSTimer`不是线程安全的,它通常在应用程序的...

    IOS开发代码分享之用nstimer实现倒计时功能

    注意:在实际项目中,通常还需要处理`NSTimer`的暂停、恢复和销毁操作,以适应用户交互或节省系统资源。例如,当应用进入后台时,应暂停`NSTimer`,回到前台时恢复。同时,确保在不再需要倒计时时,调用`[theTimer ...

    UIScrollView + UIPageControl +NSTimer 做循环播放View

    最后,当定时器触发时,我们需要暂停或恢复 `UIScrollView` 的滚动(如果正在手动滚动),防止冲突。同时,确保在不再需要定时器时调用 `invalidate` 方法来停止它,以避免内存泄漏。 总之,这个项目结合了 `...

    IOS应用源码之AnimationPause.zip

    - 控制动画暂停的逻辑,可能涉及到CADisplayLink或NSTimer的暂停和恢复。 - 实现暂停和恢复功能的方法,例如`pauseAnimation`和`resumeAnimation`。 - 可能会有专门的类或结构体来管理动画状态。 学习这个源代码...

    swift-Repeat:是NSTimer的小型轻量级替代品具有现代Swift语法

    与`NSTimer`相比,`Repeat`的优势在于其易用性、可读性和低耦合度。它减少了因为不熟悉`NSTimer`API而导致的潜在错误,同时使代码更加整洁。对于那些追求代码质量和开发效率的Swift开发者来说,`Repeat`是一个值得...

    游戏倒计时动画_ios源码

    这个"游戏倒计时动画_ios源码"是实现这种功能的一个示例项目,名为TimeCountDemo,它包含了时间条动画的实时暂停和恢复功能。 首先,我们来理解一下倒计时动画的基本原理。倒计时动画通常是通过计算剩余时间并将其...

    ios-Timer不用担心内存泄漏的定时器.zip

    在某些场景下,可能需要临时停止定时任务,比如用户暂停游戏或者应用进入后台,然后再恢复任务。NSTimer本身并不直接提供这样的操作,而XTimer提供了这些高级功能,使得开发者能够更加灵活地控制定时任务的执行状态...

    iOS中的NSTimer定时器的初步使用解析

    为避免这种情况,我们需要在离开界面时暂停定时器,并在返回时恢复: ```swift - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [_timer invalidate]; // 停止定时器 } - ...

    Timer:NSTimer的二次封装,科学严谨好用

    5. **管理工具**:可能提供了一套管理工具,方便暂停、恢复、清除定时器集合等操作。 通过查看"Timer-master"这个压缩包,我们可以预期其中包含源码、示例项目和可能的文档,帮助开发者更好地理解和使用这个封装库...

    UIScrollview循环滚动

    在这个过程中,通常会结合使用NSTimer来实现自动滚动效果,并且在用户进行手动拖动时暂停滚动,用户停止操作后恢复自动滚动。 首先,我们需要创建一个UIScrollView,并设置其contentSize,使得内容的宽度或高度大于...

    倒计时demo

    2. **生命周期管理**: 使用NSTimer时,需要注意其生命周期与引用计数的关系。为了避免内存泄漏,当不再需要倒计时的时候,需要取消定时器(调用`invalidate`方法)。 3. **线程调度**: 倒计时通常在主线程上进行,...

    IOS 解决后台计数器不准确问题

    在iOS开发中,遇到的一个常见问题是当应用进入后台后,基于`NSTimer`的计时器可能会暂停或者计数不准确。这是因为`NSTimer`在应用进入后台时默认会被暂停,以节省系统资源。为了解决这个问题,我们需要采用特殊策略...

Global site tag (gtag.js) - Google Analytics