延迟执行的几种方法,分享一下. 1.performSelector(NSObject)方法  2.NSTimer方法  3.GCD方法  4.sleep(NSThread)方法

1.performSelector(NSObject)方法

  这是iOS中常用的一种延迟执行方法.

  特点:这个方法必须要在主线程中使用.可以传递参数.可以取消操作,不能暂停.

    //不带参数
  [self performSelector:@selector(delayDo:) withObject:nil afterDelay:1.0f];
   //带参数
  [self performSelector:@selector(delayDo:) withObject:@"abc" afterDelay:1.0f];

取消操作分为2种:

  (1)取消所有延迟执行操作

[NSObject cancelPreviousPerformRequestsWithTarget:self];

(2)取消指定的延迟执行操作

  当你取消指定的延迟操作时,操作的唯一标示是传递的参数,只有传递了正确的参数才能取消操

 //取消不传参的方法
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayDo:) object:nil];
//取消传参的方法
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayDo:) object:@"abc"];

2.NSTimer方法

  采用计时器的延迟方法

  特点:这个方法必须要在主线程中使用.可以传递参数.可以取消操作,可以暂停,可以立即执行延迟操作

  因为这个方法可以暂停,这里设置了一个变量isRun来判断是否在运行.

 //计时器对象
NSTimer * timer;
//作为计时器判断状态的变量
BOOL isRun;

开始计时,repeats:NO.只执行一次.  YES,循环重复执行.

  isRun = YES;
timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayDo:) userInfo:@"abc" repeats:YES];

暂停操作:

      if (isRun) {
#warning 此方法是暂停的功能 其实是把时间拉远了
isRun = NO;
[timer setFireDate:[NSDate distantFuture]];
}
else if (!isRun) {
#warning 恢复计时器
isRun = YES;
[timer setFireDate:[NSDate date]];
}

不等待计时器,立即执行延迟操作

[timer fire];

销毁/彻底取消计时器

      #waring 此方法策底取消了Timer  不是暂停
[timer invalidate];

这里要说明一下,并不是只有invalidate方法才能销毁计时器,当repeats属性设为NO,计时器运行以后将会自动销毁.

那么参数呢? NSTimer的参数是userInfo,所以要使用userInfo方法才能提取到正确的参数

NSlog(@"sender:%@",[sender userInfo]);

3.GCD方法

  特点:这个方法不限制线程,不容易取消操作.

  为什么不能取消操作?代码交给了GCD自动进行处理,开发者不容易操作.

 //在主线程延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self delayDo:@"GCD"];
});
//在子线程延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
[self delayDo:@"Global-GCD"];
});

改变 (5 * NSEC_PER_SEC) 的数字就可改变延迟时间,单位是秒.

  默认是在主线程,改变dispatch_get_main_queue() ------->dispath_get_global_queue() 就可让代码在子线程执行.

4.Sleep(NSThread)方法

  特点:卡主当前线程来实现延迟操作,使用需谨慎. 有些时候,用起来还是很方便的.

[NSThread sleepForTimeInterval:];

最好不要在主线程中使用,否则会卡住界面.

ios开发之-- 延迟执行方法的更多相关文章

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

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

  2. 李洪强iOS开发Swift篇—10_方法

    李洪强iOS开发Swift篇—10_方法 一.简单说明 跟其他面向对象语言一样,Swift中的方法可以分为2大类: (1)实例方法(Instance Methods) 在OC中,实例方法以减号(-)开 ...

  3. IOS开发中重写init方法使用需谨慎

    IOS开发中重写init方法使用需谨慎 今天在写一个小软件的时候出现一点问题,这个软件的功能是搜索全国学校,首页就是搜索输入框,在框中输入完要查询的学校所在省份,点击buttom后就会跳转到对应的视图 ...

  4. iOS开发UITableView基本使用方法总结

    本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDa ...

  5. iOS开发UITableView基本使用方法总结 分类: ios技术 2015-04-03 17:51 68人阅读 评论(0) 收藏

    本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDa ...

  6. iOS开发使用半透明模糊效果方法整理

    虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开 ...

  7. iOS定时器、延迟执行

    1.通用方式(并不是实时调用并且会卡顿): // 一般用于更新一些非界面上的数据 [NSTimer scheduledTimerWithTimeInterval:时间间隔 target:self se ...

  8. [转]iOS开发使用半透明模糊效果方法整理

    转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包 ...

  9. iOS开发-获取属性和方法

    iOS开发数据存储有两种方式,属性列表和对象编码,属性列表可以通过NSArray,NSMutableArray,NSMutableDictionary,存储对象我们可以通过归档和解档来完成.如果我们想 ...

随机推荐

  1. linq操作符:串联操作符

    串联是一个将两个集合连接在一起的过程.在Linq中,这个过程通过Concat操作符实现.Concat操作符用于连接两个集合,生成一个新的集合.来看看Concat操作符的定义: public stati ...

  2. 《C++程序设计教程——给予Visual Studio 2008》读书笔记3章

    CLR(Common Language Runtime,通用运行时),负责在执行时管理代码,提供内存管理和线程管理等核心服务,同时又确保代码的安全性和准确性.

  3. [redis] redis连接远程客户端查询数据

    F:cd redis-2.8.12redis-cli.exe -h 192.168.6.107 -p 16680redis-cli.exe -h 192.168.6.107 -p 16681redis ...

  4. Enums and Lookup Tables with EF Code First

    With EntityFramework’s support for enums, there is no longer any need to include lookup tables in th ...

  5. Qt中使用的C++知识和技能-你必须要了解的

    如果你不确定在使用Qt编程时自己所掌握的C++知识是否够用,这一节的内容会帮到你.这里给出了Qt自身以及在使用Qt进行编程时涉及到的C++知识,因此,通过阅读本节,你会了解你是否缺少一些C++技能. ...

  6. 总结这两天连续干掉的bug In 创新实训 智能自然语言交流系

    临近项目合并,在pre合并中出现相当多的hug,遂记之 ps:这只是总结一下提纲,具体的方法在前文的博文中都详细记录.总结了. 平台的移植兼容性,虽然是跨平台的java,但是依旧有很多的意外: 1.从 ...

  7. 慎用 apt-get autoremove !

    apt-get 提供了一个用于下载和安装软件包的简易命令行界面. 卸载软件包主要有这3个命令 remove – 卸载软件包 autoremove – 卸载所有自动安装且不再使用的软件包 purge – ...

  8. Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int selec ...

  9. 【转】【Centos】nginx配置:location配置方法及实例详解

    location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? 格式 location [ 空格 | = | ~ | ~* |^~ | !~ | !~* ...

  10. C++ namespace的用法

    //namesp.h namespace pers{     const int LEN = 40;     struct Person{         char fname[LEN];       ...