iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Objective-C计时器NSTimer怎么使用
  • 457
分享到

Objective-C计时器NSTimer怎么使用

2023-07-05 18:07:44 457人浏览 安东尼
摘要

这篇文章主要介绍“Objective-C计时器NSTimer怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Objective-C计时器NSTimer怎么使用”文章能帮助大家解决问题。NSTi

这篇文章主要介绍“Objective-C计时器NSTimer怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Objective-C计时器NSTimer怎么使用”文章能帮助大家解决问题。

NSTimer - 计时器

NSTimer派生自NSObject,是一种计时器,在经过一定的时间间隔后触发,向目标对象发送指定的消息。

计时器(NSTimer)与运行循环(RunLoop)一起工作。运行循环维护对其计时器的强引用,因此在将计时器添加到运行循环后,不必自己维护对计时器的强引用。

计时器不是实时机制。如果计时器的触发时间发生在长运行循环调用期间,或者当运行循环处于不监视计时器的模式时,计时器在下次运行循环检查计时器之前不会触发,因此计时器触发的实际时间可能要晚得多。

NSTimer创建计时器函数

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

函数描述 :使用指定的调用对象初始化计时器对象。必须使用addTimer:fORMode:方法将初始化的计时器添加到运行循环中(如果计时器配置为重复,则一次计时结束无需将计时器重新添加到运行循环中)。然后,在ti过去之后,计时器将触发,由调用对象执行其调用。

参数 :

ti :计时器触发之间的秒数。如果ti小于或等于0.0,此方法将选择非负值0.1毫秒。

invocation :计时器触发时要使用的调用对象。计时器指示调用对象维护对其参数的强引用。

repeats :是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

返回值 :一个新的根据指定的参数进行配置的NSTimer对象。

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

函数描述 :使用指定的对象和选择器初始化计时器对象。必须使用addTimer:forMode:方法将新计时器添加到运行循环中(如果计时器配置为重复,则一次计时结束无需将计时器重新添加到运行循环中)。然后,经过ti秒后,计时器启动,向目标发送selector消息。

参数 :

ti :计时器触发之间的秒数。如果ti小于或等于0.0,此方法将选择非负值0.1毫秒。

aTarget :当计时器触发时,选择器指定要向其发送消息的对象。计时器维持对目标的强引用,直到它(计时器)失效。

aSelector :计时器触发时要发送给目标的消息。

repeats :是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

返回值 :一个新的根据指定的参数进行配置的NSTimer对象。

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (NS_SWIFT_SENDABLE ^)(NSTimer *timer))block api_AVaiLABLE(Macosx(10.12), iOS(10.0), watchos(3.0), tvos(10.0));

函数描述 :使用指定的时间间隔和块初始化计时器对象。必须使用addTimer:forMode:将新计时器添加到运行循环中(如果计时器配置为重复,则一次计时结束无需将计时器重新添加到运行循环中)。然后,在间隔秒后,计时器启动,执行块。

参数 :

interval :计时器启动之间的秒数。如果间隔小于或等于0.0,此方法将选择非负值0.1毫秒。

repeats :是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

block :计时器启动时要执行的块。该块采用单个NSTimer参数,并且没有返回值。

返回值 :一个新的根据指定的参数进行配置的NSTimer对象。

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (NS_SWIFT_SENDABLE ^)(NSTimer *timer))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

函数描述 :使用指定日期与时间间隔以及一个块初始化计时器对象。 必须使用addTimer:forMode:方法将新计时器添加到运行循环中(如果计时器配置为重复,则一次计时结束无需将计时器重新添加到运行循环中)。在指定日期到达后计时器触发,之后每间隔interval秒,计时器触发,执行block。

参数 :

date :计时器应首次启动的时间。

interval :计时器启动之间的秒数。如果间隔小于或等于0.0,此方法将选择非负值0.1毫秒。

repeats :是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

block :计时器启动时要执行的块。该块采用单个NSTimer参数,并且没有返回值。

返回值 :一个新的根据指定的参数进行配置的NSTimer对象。

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(nullable id)ui repeats:(BOOL)rep NS_DESIGNATED_INITIALIZER;

函数描述 :使用指定的对象和选择器初始化计时器。必须使用addTimer:forMode:方法将新计时器添加到运行循环中(如果计时器配置为重复,则一次计时结束无需将计时器重新添加到运行循环中)。在指定日期到达后计时器触发,之后每间隔interval秒,计时器触发,向目标发送aSelector消息。

参数 :

date :计时器应首次启动的时间。

ti :计时器启动之间的秒数。如果间隔小于或等于0.0,此方法将选择非负值0.1毫秒。

t :当计时器触发时,选择器指定要向其发送消息的对象。计时器维持对目标的强引用,直到它(计时器)失效。

s :计时器触发时要发送给目标的消息。

ui : 计时器的用户信息。计时器维持对这个对象的强引用,直到它(计时器)失效。这个参数可以是nil。

rep : 是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

例如:需要添加到运行循环中的计时器\color{red}{例如:需要添加到运行循环中的计时器}例如:需要添加到运行循环中的计时器

- (void)viewDidLoad {    [super viewDidLoad];    //获取方法签名对象    NSMethodSignature *signature = [self methodSignatureForSelector:NSSelectorFromString(@"timerAction")];    //获取调用对象,设置调用对象调用者与调用消息    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];    invocation.target = self;    invocation.selector = NSSelectorFromString(@"timerAction");    //计时器加入运行循环    [[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1.0 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];}///计时器调用函数- (void)timerAction {    NSLog(@"计时器工作中");}

不加入运行循环,则只会打印一次,加入运行循环后,打印如下 :

Objective-C计时器NSTimer怎么使用

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

函数描述 :创建计时器并以默认模式在当前运行循环上调度它。在ti秒过去后,计时器触发,由调用对象执行其调用。

参数 :

ti :计时器启动之间的秒数。如果ti小于或等于0.0,此方法将选择非负值0.1毫秒。

invocation :计时器触发时要使用的调用对象。计时器指示调用对象维护对其参数的强引用。

repeats :是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

返回值 : 根据指定参数配置的新NSTimer对象。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

函数描述 :创建计时器并以默认模式在当前运行循环上调度它。在ti秒过去后,计时器触发,发送消息选择器到目标。

参数 :

ti :计时器启动之间的秒数。如果ti小于或等于0.0,此方法将选择非负值0.1毫秒。

aTarget :当计时器触发时,选择器指定要向其发送消息的对象。计时器维持对目标的强引用,直到它(计时器)失效。

aSelector :计时器触发时要发送给目标的消息。

userInfo : 计时器的用户信息。计时器维持对这个对象的强引用,直到它(计时器)失效。这个参数可以是nil。

repeats : 是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

返回值 : 根据指定参数配置的新NSTimer对象。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (NS_SWIFT_SENDABLE ^)(NSTimer *timer))block API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));

函数描述 :创建一个计时器,并在默认模式下在当前运行循环中对其进行调度。在间隔秒后,计时器启动,执行块。

参数 :

interval : 计时器启动之间的秒数。如果间隔小于或等于0.0,此方法将选择非负值0.1毫秒。

repeats :是否重复,如果是YES,计时器将重复重新安排自己,直到失效。如果NO,计时器将在其触发后失效。

block :计时器启动时要执行的块。该块采用单个NSTimer参数,并且没有返回值。

返回值 :一个新的根据指定的参数进行配置的NSTimer对象。

例如:以默认模式在当前运行循环上执行计时器\color{red}{例如:以默认模式在当前运行循环上执行计时器 }例如:以默认模式在当前运行循环上执行计时器

- (void)viewDidLoad {    [super viewDidLoad];    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];}///计时器调用函数- (void)timerAction {    NSLog(@"计时器工作中");}

打印如下 :

Objective-C计时器NSTimer怎么使用

NSTimer触发与销毁计时器函数

- (void)fire;

函数描述:使计时器的消息被发送到它的目标。可以使用此方法来触发重复计时器而不中断其常规触发计划。如果计时器是非重复的,它在触发后会自动失效,即使它的预定触发日期还没有到达。

- (void)invalidate;

函数描述:停止触发的计时器,并请求将其从运行循环中删除。这个方法是从NSRunLoop对象中删除计时器的唯一方法。NSRunLoop对象会在invalidate方法返回之前或之后的某个时间点删除它对计时器的强引用。如果配置了target和userInfo对象,计时器也会删除对这些对象的强引用。

常用属性

@property (copy) NSDate *fireDate;

属性描述:计时器触发的日期。如果计时器已经失效,则为计时器触发的最后日期。可以设置此属性以调整重复计时器(repeats为YES)的触发时间。尽管重置计时器的下一次触发时间是一个相对昂贵的操作,但在某些情况下它可能更有效。例如,可以在未来想要以不规则的时间间隔多次重复某个操作的情况下使用它。调整单个计时器的触发时间比创建多个计时器对象,在一个运行循环中调度每个对象,然后销毁它们所产生的开销要小。

对于已经失效的计时器(包括已经触发的非重复计时器),不应该更改其触发日期。可以更改尚未触发的非重复计时器的触发日期,但应该始终从计时器所连接的线程进行更改。使用valid属性可以验证计时器是否有效。

@property (readonly) NSTimeInterval timeInterval;

属性描述:计时器的时间间隔,以秒为单位。如果计时器不重复,即使设置了时间间隔,也会返回0。

@property NSTimeInterval tolerance API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));

属性描述:计时器到达预定触发日期,触发时可以应用的额外时间容差。默认值为0,这意味着没有应用额外的容差。为计时器设置容差可以使其在预定触发日期到达后,偏移计时器触发。计时器可以在预定触发日期与额外时间容差加上预定触发日期之间的任何时间触发。允许系统在计时器触发时具有灵活性,可以提高系统优化的能力,以提高功耗节省和响应能力。

@property (readonly, getter=isValid) BOOL valid;

属性描述:一个布尔值,用于指示计时器当前是否有效。如果计时器仍然能够触发,则为YES;如果计时器已经失效并且不再能够触发,那么为NO。

@property (nullable, readonly, retain) id userInfo;

属性描述:计时器的userInfo对象。计时器无效后,不要访问此属性。使用valid属性验证计时器是否有效。

NSRunLoop - 运行循环

一个管理输入源(手势、Selector等)的对象,Runloop即运行循环,是iOS中的消息处理机制,其主要作用是控制NSRunLoop里面线程的执行和休眠,当某个事件执行完成后,不退出其线程而进入休眠状态,当再次检测到事件时。唤醒休眠的线程继续处理事件。RunLoop可以保持程序的持续运行,并节省CPU资源,提高程序性能。

NSRunLoop是对CFRunLoopRef的一层封装, 是Objective-C的语法的框架。CFRunLoopRef是基于C语言开源框架。

从NSRunLoop的角度来看,NSTimer对象并不是输入源,它们是一种特殊的类型,当它们被触发时,不会导致运行循环返回。

NSRunLoop类通常不是线程安全的,只能在当前线程的上下文中调用它的方法。

NSRunLoop 处理事件流程:

Objective-C计时器NSTimer怎么使用

NSRunLoop常用属性

@property (class, readonly, strong) NSRunLoop *currentRunLoop

属性描述:类属性,返回当前线程的运行循环(NSRunLoop对象)。如果线程还不存在运行循环,则会创建并返回一个运行循环。

@property (class, readonly, strong) NSRunLoop *mainRunLoop API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));

属性描述:类属性,返回主线程的运行循环(NSRunLoop对象)。

@property (nullable, readonly, copy) NSRunLoopMode currentMode;

属性描述:调用方的当前输入模式。这个方法仅在调用方运行时返回当前的输入模式,否则它返回nil。

Runloop模式:

NSDefaultRunLoopMode:默认状态(空闲状态),比如点击按钮都是这个状态

UITrackingRunLoopMode:滑动时的Mode。比如滑动UIScrollView时。

UIInitializationRunLoopMode:私有的,APP启动时。就是从iphone桌面点击APP的图标进入APP到第一个界面展示之前,在第一个界面显示出来后,UIInitializationRunLoopMode就被切换成了NSDefaultRunLoopMode。

NSRunLoopCommonModes:它是NSDefaultRunLoopMode和UITrackingRunLoopMode的集合。结构类似于一个数组。在这个mode下执行其实就是两个mode都能执行而已。

NSRunLoop常用函数

- (CFRunLoopRef)getCFRunLoop CF_RETURNS_NOT_RETAINED;

函数描述:返回调用方的基础CFRunLoop对象。可以使用返回的运行循环来使用Core Foundation函数调用配置当前运行循环。例如可以使用此函数来设置运行循环观察者。

返回值 :调用方的基础CFRunLoop对象。

- (void)addTimer:(NSTimer *)timer forMode:(NSRunLoopMode)mode;

函数描述:使用给定的输入模式注册给定的计时器。可以将计时器添加到多种输入模式中。在指定模式下运行时,调用方会使计时器在其计划的启动日期当天或之后启动。触发后,计时器调用其关联的处理程序例程,该例程是指定对象上的选择器。调用方保留计时器。要从安装计时器的所有运行循环模式中删除计时器,需要向计时器发送invalidate消息。

参数 :

timer :要向调用方注册的计时器。

mode :添加计时器的模式。

关于“Objective-C计时器NSTimer怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Objective-C计时器NSTimer怎么使用

本文链接: https://www.lsjlt.com/news/354578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Objective-C计时器NSTimer怎么使用
    这篇文章主要介绍“Objective-C计时器NSTimer怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Objective-C计时器NSTimer怎么使用”文章能帮助大家解决问题。NSTi...
    99+
    2023-07-05
  • Objective-C中的@Synchronized关键字怎么使用
    这篇文章主要介绍“Objective-C中的@Synchronized关键字怎么使用”,在日常操作中,相信很多人在Objective-C中的@Synchronized关键字怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-07-05
  • C#四种计时器Timer怎么使用
    这篇文章主要介绍了C#四种计时器Timer怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#四种计时器Timer怎么使用文章都会有所收获,下面我们一起来看看吧。1、System.Threading.Ti...
    99+
    2023-06-30
  • 怎么使用C语言实现计时器
    本篇内容主要讲解“怎么使用C语言实现计时器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用C语言实现计时器”吧!实现思路简单介绍一下我的实现思路:本文包括三个版本,分别是极简版、普通版、高...
    99+
    2023-06-25
  • iOS定时器选择及CADisplayLink NSTimer和GCD使用的方法是什么
    本篇内容介绍了“iOS定时器选择及CADisplayLink NSTimer和GCD使用的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2023-07-05
  • C#中使用Stopwatch计时器实现暂停计时继续计时功能
    最近程序上用到了计时功能,对某个模块进行计时,暂停的时候模块也需要暂停,启动的时候计时继续 用到了Stopwatch Stopwatch的命名空间是using System.Diag...
    99+
    2024-04-02
  • jquery计时器怎么用
    随着互联网的发展和应用场景的多样化,倒计时和计时器的应用越来越普遍。在网站的注册页面、活动页面、促销页面等地方经常会看到倒计时和计时器的身影。如何使用jQuery库来实现这个功能呢?下面我们将详细介绍如何使用jQuery计时器。jQuery...
    99+
    2023-05-14
  • 如何使用Redis和Objective-C开发实时地理位置跟踪功能
    如何使用Redis和Objective-C开发实时地理位置跟踪功能地理位置跟踪功能已成为许多应用程序不可或缺的一部分,例如实时位置共享、打车应用和社交媒体等。在移动应用程序中实现实时地理位置跟踪功能面临许多挑战,例如数据存储、定位服务和数据...
    99+
    2023-10-22
    redis Objective-C 实时地理位置跟踪
  • c#怎么计算时间差
    在 c# 中计算时间差的方法是:使用 datetime 结构的 subtract 方法计算两个时间值之间的差值,返回一个 timespan 对象表示时间差;timespan 结构包含 d...
    99+
    2024-05-12
    c#
  • Win10如何使用计时器(倒计时)测量时间
      Win10的新版闹钟应用里包含闹钟、秒表、计时器、世界时间四个跟时间设置有关的小软件,我们介绍了闹钟和秒表的使用。那么如何使用计时器呢   打开倒计时   如何设置   我们可以使用鼠标移动圆圈的结束按钮,设置我们的...
    99+
    2023-06-12
    Win10 计时器 时间 测量 倒计时
  • C++时间函数怎么使用
    这篇文章主要介绍“C++时间函数怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++时间函数怎么使用”文章能帮助大家解决问题。一、 时间概念格林威治时间GMT(Greenwich Mean ...
    99+
    2023-07-04
  • 怎么用Go实现计时器
    这篇文章主要介绍“怎么用Go实现计时器”,在日常操作中,相信很多人在怎么用Go实现计时器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Go实现计时器”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!引言...
    99+
    2023-06-30
  • 使用javascript怎么实现一个定时器倒计时功能
    这期内容当中小编将会给大家带来有关使用javascript怎么实现一个定时器倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。<!DOCTYPE html><html&n...
    99+
    2023-06-14
  • 使用CocosCreator怎么实现一个计时器功能
    这篇文章给大家介绍使用CocosCreator怎么实现一个计时器功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、setTimeOut3秒后打印abc。只执行一次。setTimeout(()=>{consol...
    99+
    2023-06-14
  • C#中怎么计算时间间隔
    本篇文章给大家分享的是有关C#中怎么计算时间间隔,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#计算时间间隔实例/// <summary> &...
    99+
    2023-06-17
  • Spring计时器stopwatch使用详解
     StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),适用于同步单线程代码块。 正...
    99+
    2024-04-02
  • Android中怎么使用flow实现倒计时
    本篇内容主要讲解“Android中怎么使用flow实现倒计时”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android中怎么使用flow实现倒计时”吧!现在因为有了协程和Flow,我们可以借助...
    99+
    2023-06-30
  • C#中的三种定时计时器Timer用法介绍
    在.NET中有三种计时器: 1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabl...
    99+
    2024-04-02
  • 怎么使用C#实现简单的计算器功能
    这篇文章主要介绍怎么使用C#实现简单的计算器功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境:VS2010及以上版本建立个Window窗体应用在工具箱里拖出两个TextBox,第一个放上面,第二个放下面 。主要...
    99+
    2023-06-29
  • C#中的延时函数怎么使用
    本篇内容主要讲解“C#中的延时函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的延时函数怎么使用”吧!C#一些延时函数sleep延时方法System.Threading.Thre...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作