公用延迟执行的方法:

- (void)delayMethod {

NSLog(@"delayMethodEnd");

}

方法一、performSelector 方法

1、延迟执行

/**

* 延迟执行

*

* @param aSelector 方法名称

* @param anArgument 要传递的参数,如果无参数,就设为nil

* @param delay 延迟的时间

*/

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

2、取消延迟执行

下面两个方法都是类方法,不能用实例对象去调用,只能用 NSObject。

/**

* 取消延迟执行的某一方法

*

* @param aTarget 一般填self

* @param aSelector 延迟执行的方法

* @param anArgument 设置延迟执行时填写的参数(必须和上面performSelector方法中的参数一样)

*/

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;

/**

* 取消延迟执行的所有方法

*

* @param aTarget 一般填self

*/

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

3、使用如下:

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:2.0];

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayMethod) object:nil];

[NSObject cancelPreviousPerformRequestsWithTarget:self];

方法二、NSTimer 定时器

1、延迟执行

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

2、取消延迟执行

- (void)invalidate;

3、使用如下:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

[timer invalidate];

方法三、NSThread线程的sleep

1、延迟执行

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;

注:此方法是一种阻塞执行方式,建议放在子线程中执行,否则会卡住界面。但有时还是需要阻塞执行,如进入欢迎界面需要沉睡3秒才进入主界面时。

2、取消延迟执行

sleep放入子线程,可以通过处理取消。

3、使用如下:

[NSThread sleepForTimeInterval:2.0];

[self delayMethod];

方法四、GCD

1、延迟执行

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

});

2、取消延迟执行

// to do

3、使用如下:

int64_t delayInSeconds = 10.0; // 延迟的时间

/*

* delta:

*

* @parameter 1.时间参照,从此刻开始计时

* @parameter 2.延时多久,此处为秒级,还有纳秒等: 10ull * NSEC_PER_MSEC

*/

__weak typeof(self)weakSelf = self;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[weakSelf delayMethod];

});

最后

完整代码:

- (void)allMethod {

// 1.

[self performSelector:@selector(delayMethod) withObject:nil afterDelay:2.0];

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayMethod) object:nil];

[NSObject cancelPreviousPerformRequestsWithTarget:self];

// 2.

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

[timer invalidate];

// 3.

[NSThread sleepForTimeInterval:2.0];

[self delayMethod];

// 4.

int64_t delayInSeconds = 10.0; // 延迟的时间

/*

* delta:

*

* @parameter 1.时间参照,从此刻开始计时

* @parameter 2.延时多久,此处为秒级,还有纳秒等: 10ull * NSEC_PER_MSEC

*/

__weak typeof(self)weakSelf = self;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[weakSelf delayMethod];

});

}

- (void)delayMethod {

NSLog(@"delayMethodEnd");

}

iOS 设置 延迟执行 与 取消延迟执行 方法 以及对 run loop 初步认识

之前开发过程中经常会有需求会使用 NSObject中的"performSelector:withObject:afterDelay:"做方法延迟执行的处理, 但是 还没有什么地方需 ...

IOS中延迟执行的几种方法

前几天去国美在线面试,就遇到了上面的问题,当时是笔试,只写出来了第一种方法,现在整理了一下. //1.performSelector方法:在当前线程中执行的方法,使用默认模式,并延迟执行@select ...

iOS中UIWebView执行JS代码(UIWebView)

iOS中UIWebView执行JS代码(UIWebView) 有时候iOS开发过程中使用 UIWebView 经常需要加载网页,但是网页中有很多明显的标记让人一眼就能看出来是加载的网页,而我们又不想被 ...

C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

聊聊业务系统中投递消息到mq的几种方式

背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...

Mybatis中使用association进行关联的几种方式

这里以一对一单向关联为例.对使用或不使用association的配置进行举例.  实体类: @Data @ToString @NoArgsConstructor public class IdCard ...

【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

Action中取得request,session的四种方式

Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...

Dojo初探之2:设置dojoConfig详解,dojoConfig参数详解+Dojo中预置自定义AMD模块的四种方式(基于dojo1.11.2)

Dojo中想要加载自定义的AMD模块,需要先设置好这个模块对应的路径,模块的路径就是这个模块的唯一标识符. 一.dojoConfig参数设置详解 var dojoConfig = { baseUrl: ...

随机推荐

php的面向对象

今天PO一段php的面向对象相关知识吧.面向对象的相关概念和理论知识是很抽象的,要结合现实中的事物来理解,这样有助于类比记忆.还有就是要多接触吧,量变引质变这个应该还是一个硬道理吧,有时候量够了的话, ...

关于NOIP2016与NOI2018

NOIP2016惨淡收场了,距离省一还有相当一大段距离,省队更是差了十条街去了,不过没关系. 既然已经对信息学产生了兴趣,竞赛无疑是最好的锻炼场所. 路是自己选择的,伤痕累累也要走下去. 还有一年,事 ...

R语言简单聚类分析

#以R基础包自带的鸢尾花(Iris)数据进行聚类分析iris data

PHP获取APP客户端的IP地址的方法

分析php获取客户端ip 用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ func ...

ARP攻击之Kali Linux局域网断网攻击

特别声明: 我们学习研究网络安全技术的目的应是为了维护网络世界的安全,保护自己和他人的私有信息不被非法窃取和传播.请您遵守您所在地的法律,请勿利用本文所介绍的相关技术做背离道德或者违反法律的事情. S ...

堆应用---构造Huffman树(C++实现)

堆: 堆是STL中priority_queue的最高效的实现方式(关于priority_queue的用法:http://www.cnblogs.com/flyoung2008/articles/213 ...

【Common】NO.81.Note.1.Common.1.002-【文章摘要】

1.0.0 Summary Tittle:[Common]NO.81.Note.1.Common.1.002-[文章摘要] Style:Common Series:Common Since:2018- ...

linux下直接复制文件内容到剪切板

title: linux下直接复制文件内容到剪切板 date: 2017-11-23 17:00:06 tags: categories: Linux 首先安装xsel. xsel --input - ...

Tree Implementation with Python

Tree Implementation with Python List of List 代码如下: def binary_tree(val): return [val, [], []] def in ...

2018.4.23 git常用操作命令收集(转)

Git常用操作命令收集: 1. 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v ...

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐