iOS 设置 延迟执行 与 取消延迟执行 方法 以及对 run loop 初步认识
之前开发过程中经常会有需求会使用 NSObject
中的"performSelector:withObject:afterDelay:"做方法延迟执行的处理, 但是 还没有什么地方需要实现 取消 这个延迟执行方法"cancelPreviousPerformRequestsWithTarget:".(具体可参见系统库文件 NSOject里面两个方法的声明).
但是 我们应该知道在什么条件下,合理使用 延迟 与 取消延迟.
延迟 和 取消延迟 应该 在同一个 事件处理循环(Run loop)里,不然 是无法取消的. (之前 不知道 啥叫 Run loop 哭~ 因为突然要使用 取消延迟执行的方法 才了解到的)
Run loop :一般程序至少有一个线程,那么这个线程是主线程, 而这个线程上会有一个 runloop(负责所有主线程的事件,包括UI事件) 一直在循环,就是我理解的事件处理循环,它会一直监听 是否有相应的触发动作(人为也好,内部机制也好),有则会立即做出对对应消息的响应,没有则处于等待状态甚至休眠.那么 我可以说 这个 run loop 是依附在对应的线程里面的.它的生命周期随着线程的启动终止等变化而变化.
在 苹果官方文档里还有示意图,详细讲解,我理解的"触发动作"即 "源事件"
Runloop接收两种源事件:input sources和timer sources。
input sources 传递异步事件,通常是来自其他线程和不同的程序中的消息;(基于端口的输入源,自定义输入源,Cocoa上的Selector源)
timer sources(定时器) 传递同步事件(重复执行或者在特定时间上触发)。//如果要设定NSTimer 要在当前的Run loop 里设定(一般在主线程里),在子线程里面设置NSTime,要获取子线程的Run loop,才有效 "[[NSRunLoop currentRunLoop] addTimer:.....]"
那我今天用到的 "延迟 和 取消延迟"也是一种定时器,应该属于"timer sources(定时器) "类型的"源事件".所以也要在当前线程的Run loop里面处理这个问题
描述一下,我使用 延迟 和取消延迟的使用场景:
在播放视频的过程中, 点击屏幕时候 要展示菜单,如果无其他操作,菜单自动消失,如果是再单点击屏幕则菜单被手动触发消失.
那么在整个交互逻辑的过程中,从展示菜单那一刻起,添加 "延迟方法" ,如果是单点屏幕取消菜单,则要"取消延迟".
代码如下:
[self performSelector:@selector(onClickOverlay:) withObject:nil afterDelay:DelayTimeSeconds];
//延迟
[NSObject cancelPreviousPerformRequestsWithTarget:self]; //这个是取消当前run loop 里面所有未执行的 延迟方法(Selector Sources)
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(onClickOverlay:) object:nil];// @selector 和 object 都和 延迟一致 就是 指定取消 未执行的一条或者多条的延迟方法.
参考文章
iOS 官方 runloop (先看这个 最重要)
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
认识runloop
http://www.jianshu.com/p/613916eea37f
runloop 详解
http://blog.csdn.net/ztp800201/article/details/9240913
iOS 设置 延迟执行 与 取消延迟执行 方法 以及对 run loop 初步认识的更多相关文章
- 背水一战 Windows 10 (106) - 通知(Toast): 通过 toast 打开协议, 通过 toast 选择在指定的时间之后延迟提醒或者取消延迟提醒
[源码下载] 背水一战 Windows 10 (106) - 通知(Toast): 通过 toast 打开协议, 通过 toast 选择在指定的时间之后延迟提醒或者取消延迟提醒 作者:webabcd ...
- 关于TortoiseGit设置代理服务器会自动取消的问题解决方法
在前些日子,我使用TortoiseGit的并给其设置代理服务器的时候,每次设置好之后,关闭打开总是会自动取消勾选,通过不断的尝试和分析之后,得出了解决方案. 首先,这个配置项是保存在HOME环境变量对 ...
- iOS中延迟执行和取消的几种方式
公用延迟执行的方法: - (void)delayMethod { NSLog(@"delayMethodEnd"); } 方法一.performSelector 方法 1.延迟执行 ...
- IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget
本文非本人撰写 @interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObj ...
- celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决
今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...
- 关于iOS刷新UI需要在主线程执行
为什么一定要在主线程刷新UI? 安全+效率:因为UIKit框架不是线程安全的框架,当在多个线程进行UI操作,有可能出现资源抢夺,导致问题. 其实:在子线程是不能更新UI的, 看到能更新的结果只是个假象 ...
- iOS tableview的常用delegate和dataSource执行顺序
在这次项目中遇到了一个特别奇葩的问题:表视图创建的cell在7以上的系统能正常运行显示,在模拟器上就不能正常实现......为解决这个问题,纠结了好久...... 对在7系统上不显示的猜测: 用mas ...
- 多线程之旅(9)_如何安全的取消正在执行的线程——附C#源码
参考网址: https://blog.csdn.net/yangwohenmai1/article/details/90404497 当线程能流畅安全的自动运行后,我们就要考虑一些更风骚的操作,就是如 ...
- 异步委托方式取消BackGroundWorker执行无循环的耗时方法
边学习边分享,纯属抛砖引玉. 线程的一个好处是异步的执行操作,在winform中,很多耗时操作执行时,为优化用户体验,避免长时间等待,从而运用线程技术异步的执行耗时操作,但不会阻塞主线程. 最近系统很 ...
随机推荐
- hive 添加UDF(user define function) hive的insert语句
add JAR /home/hadoop/study/study2/utf.jar; package my.bigdata.udf; import org.apache.hadoop.hive.ql. ...
- CI框架 简介
CI工作流程: 所有的入口都从根目录下的index.php进入,确定应用所在目录后,加载 codeigniter/CodeIgniter.php 文件,该文件会顺序加载以下文件执行整个流 ...
- Ordering Tasks UVA - 10305 图的拓扑排序
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- python django -5 进阶
高级知识点包括: 静态文件处理 中间件 上传图片 Admin站点 分页 使用jquery完成ajax 管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义 ...
- 用VS2010进行CMAKE的时候“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”
由于要编译LTP,LTP在MINGW下又不能编译,所以忍痛安装了VS2010+CMAKE. 由于VS在本科时候虐我千百遍,所以一直心存阴影... 转入正题,当cmake的时候, 它提示 “LINK : ...
- SEO前端需要注意的地方
1 合理的title ,description ,keyswords 搜索引擎对这三项的权重逐渐减小,title 强调重点即可,重要的关键字不要超过两次,而且要靠前. 2 不同的tilte要有所不同, ...
- Hough变换的基本思考
一,概念: Hough变换用于在图像中检测特定性状,如线,圆,矩形等,广泛用于图像识别领域. 二,原理: 1,Hough变换直线检测: 一条直接的方程可表示为:y = a*x + b ,当a,b固定时 ...
- vue 流程
1.vue 项目搭建 2.监听 3.组件 4.路由
- Android无线测试之—Genymotion模拟器环境搭建
genymotion是一款号称速度最快性能最好的android模拟器,它基于Oracle VM VirtualBox.支持GPS.重力感应.光.温度等诸多传感器:支持OpenGL 3D加速:电池电量模 ...
- Django项目部署(django+guncorn+virtualenv+nginx)
一.说明 为了django项目部署到生产环境上,能够稳定的运行,且能够同时指出http和https的访问,对django的部署进行了一些研究,决定采用django + gunicorn + virtu ...