`
lizhuang
  • 浏览: 904327 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

NSTImer重复执行任务

 
阅读更多
问题

应用需要调度代码以在特定的时间执行。此外,你还想要重复执行任务。

解决方案

使用NSTimer调度代码以在特定的时间执行。为了使用NSTimer,你需要有日期对象与指向应用的运行循环的引用。

注意:

NSTimer需要有运行循环,如果想在Mac或iOS应用中使用定时器,就必须有运行循环。本攻略需要应用带有运行循环。1.11与1.12节分别介绍了创建Mac与iOS应用的步骤。

说明

本攻略的代码位于应用委托中。通常情况下,定时器会放在自定义类或是应用控制器中。

定时器会从特定的日期与时间开始向对象发送消息。如果应用需要重复,那么定时器可能会间隔一段时间后再发送消息。你首先需要有日期对象,用来表示定时器开始向对象发送消息的日期与时间:
NSDate *scheduledTime = [NSDate dateWithTimeIntervalSinceNow:10.0];

上述调度时间位于上面这一行代码执行后的10秒钟。可以在这里使用任何日期。

接下来,通过initWithFireDate:interval:target:selector:userInfo:repeats:构造函数创建定时器:
SString *customUserObject = @"To demo userInfo";

NSTimer *timer = [[NSTimer alloc] initWithFireDate:scheduledTime
                                          interval:2
                                            target:self
                                          selector:@selector(task)
                                          userInfo:customUserObject
                                           repeats:YES];

这里有些内容需要说明一下。第1个参数是日期对象,指定了定时器何时变成活动状态。接下来是间隔时间,是定时器再次发送消息前所需等待的秒数。之后是目标参数描述符,目标是方法所处的对象。selector参数是位于圆括号中的方法名,前面是@selector关键字。由于方法与定时器一样都位于应用委托中,因此可以使用self关键字。

userInfo是定时器使用的自定义内容。可以使用任何对象,并且可以获得正在执行的消息中的对象引用(上面的selector参数)。这里使用了字符串,但通常会使用字典或其他集合以支持更加复杂的活动。

repeats参数表示定时器是发送一次消息,还是根据第2个参数指定的时间间隔重复发送。

接下来需要指向运行循环的引用。可以通过NSRunLoop的currentRunLoop函数获得该引用:
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

现在,只需要将定时器添加到运行循环中即可:
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

10秒钟后,定时器将会开始每隔两秒钟向应用发送task消息。

启动之后,如果想停止定时器,可以向定时器发送invalidate消息。这会从运行循环中删除定时器,代码如下所示:
[timer invalidate];

参见程序清单5-7。

代码

程序清单5-7 main.m
#import "AppDelegate.h"

@implementation AppDelegate
@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    NSDate *scheduledTime = [NSDate dateWithTimeIntervalSinceNow:10.0];
    NSString *customUserObject = @"To demo userInfo";
    NSTimer *timer = [[NSTimer alloc] initWithFireDate:scheduledTime
                                              interval:2
                                                target:self
                                              selector:@selector(task)
                                              userInfo:customUserObject
                                               repeats:YES];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
}

-(void)task:(id)sender{
    NSTimer *localTimer = (NSTimer *)sender;
    NSLog(@"Schedule task has executed with this user info: %@", [localTimer  userInfo]);
}

@end

使用

要想使用上述代码,请从Xcode构建并运行Mac应用。注意控制台窗口以及消息何时开始打印到日志中。此处打印出了时间戳,这样就可以看到时间间隔的运作方式了:
2012-01-19 15:23:28.651 Timer[31067:707] Schedule task has executed with  this user info: To demo userInfo
2012-01-19 15:23:30.651 Timer[31067:707] Schedule task has executed with  this user info: To demo userInfo
2012-01-19 15:23:32.651 Timer[31067:707] Schedule task has executed with  this user info: To demo userInfo
分享到:
评论

相关推荐

    简单的时间选择器Nstimer

    `NSTimer`是苹果iOS和macOS开发中的一个核心组件,用于执行周期性的任务或者在特定时间点触发某个动作。这个“简单的时间选择器Nstimer”是一个实用工具,它提供了一个用户界面来控制`NSTimer`,允许用户进行暂停、...

    ios 时间定时器 NSTimer应用demo

    在iOS开发中,`NSTimer`是一个非常重要的类,它允许开发者在指定的时间间隔后执行某段代码,或者定期重复执行某任务。本教程将基于"ios 时间定时器 NSTimer应用demo",深入探讨`NSTimer`的使用方法、工作原理以及...

    深入理解CADisplayLink和NSTimer

    此外,如果NSTimer是以重复模式(repeat mode)运行的话,它可能会在队列较为空闲时连续触发,造成任务执行频率高于预期。 CADisplayLink使用起来也很简单,可以实例化一个CADisplayLink对象,并设置它的target和...

    NSTimer定时器

    `NSTimer`可以让你的应用程序按照预设的时间间隔执行任务,比如更新UI、发送网络请求或者执行动画效果。下面将详细探讨`NSTimer`的工作原理、创建方法、常见用法以及注意事项。 ### NSTimer的工作原理 `NSTimer`并...

    ios计时器NSTimer的使用

    在iOS开发中,`NSTimer` 是一个非常重要的类,用于在特定的时间间隔后执行某个操作,例如倒计时或定期更新UI。本教程将深入探讨`NSTimer`的使用,包括如何创建、启动、暂停以及取消定时器,并通过一个倒计时10秒的...

    NSTimer实现的小计时器

    在iOS开发中,`NSTimer`是一个常用的工具,用于在特定的时间间隔执行某项操作。本文将深入探讨`NSTimer`的使用,特别是在创建小计时器时的两种类方法,以及它们如何受到屏幕滚动事件的影响及解决方案。 一、NSTimer...

    NSTimer 使用 文档说明

    `NSTimer`是Foundation框架中的一个类,主要用于执行周期性的或一次性的任务。它可以用于各种场景,如更新UI、定时检查网络状态等。`NSTimer`通过调度到一个运行循环(`NSRunLoop`)来实现定时功能。 #### 三、创建...

    NSTimer 定时器示例

    总之,`NSTimer`是iOS和macOS开发中常用的一个工具,用于在特定时间间隔执行任务。通过理解如何创建、控制和管理`NSTimer`,开发者可以构建各种需要定时功能的应用场景,如倒计时、定时提醒等。在实际项目中,根据...

    IOS应用源码——nstimer.zip

    在iOS应用开发中,NSTimer是一个非常重要的组件,它允许开发者在特定的时间间隔执行特定的任务。这个"IOS应用源码——nstimer.zip"文件显然包含了关于如何在iOS应用中使用NSTimer的源代码示例。NSTimer是Foundation...

    ios-NStimer.zip

    3. **重复性**:`repeats`参数决定定时器是否重复执行。如果设置为`true`,那么定时器将持续触发;如果设置为`false`,则只触发一次。 4. **回调**:闭包是定时器触发时执行的代码。在这个场景中,我们可能需要更新...

    Swift:UIProgressView+NSTimer+UIstepper

    创建一个NSTimer需要一个selector(执行的方法),一个timeInterval(间隔时间),一个target(接收消息的对象)和一个 repeats(是否重复)参数: ```swift let timer = Timer.scheduledTimer(timeInterval: 0.1, ...

    DemoNSTimer

    `NSTimer`是基于RunLoop的,它可以被添加到RunLoop中以便在特定的时间间隔重复执行任务。`DemoNSTimer`这个项目显然是一个示例,展示了如何创建、启动和停止`NSTimer`,以及它在实际应用中的用法。 1. **NSTimer的...

    IOS 中NSTimer定时器的使用

    - **repeats**: 指定定时器是否重复执行。 例如,创建一个每秒执行一次的定时器,我们可以这样做: ```swift let timer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(countDownTime), userInfo...

    一个全局定时计时器,一行代码开启定时任务或者循环任务-ZXCTimer.zip

    `repeats`指示是否重复执行;`queue`指定执行block的队列,如果为空,则默认在主线程上执行;`block`是定时器触发时执行的任务。 例如,如果我们想要每秒钟执行一次任务,可以这样写: ```swift ZXCTimer....

    iOS定时器Demo

    - 使用`dispatch_get_main_queue()`确保在主线程上执行任务,保持UI更新同步。 - 与`NSTimer`不同,GCD定时器需要在不再使用时明确释放,通常在`dispatch_release`中完成。 3. **performSelector:withObject:...

    IOS 定时器

    参数包括时间间隔、目标对象、选择器方法、用户信息(可选)以及是否重复执行。 ```swift let timer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(handleTimerFired), userInfo: nil, ...

    OC-(定时器)timerWithTimeInterval

    `NSTimer`是Foundation框架的一部分,它提供了一种调度机制,可以在未来的某个时间点或以固定间隔重复执行某项任务。`timerWithTimeInterval`是`NSTimer`类的类方法,用于创建一个单次或周期性的定时器。该方法的...

    OC-Time(定时)

    `NSTimer`是Foundation框架的一部分,可以被用来安排在未来某个特定的时间执行特定的任务。下面我们将深入探讨如何在Objective-C中使用定时器。 1. **创建NSTimer**: - `NSTimer`可以通过`+...

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

    这里,`seconds`是定时器间隔,`yourMethod:`是待调用的方法,`userInfo`是可选的数据传递参数,`repeats`表示是否重复执行。 然而,`NSTimer`有一些需要注意的点: 1. **生命周期管理**:`NSTimer`必须与运行循环...

Global site tag (gtag.js) - Google Analytics