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

以前开发过程当中常常会有需求会使用 NSObject中的"performSelector:withObject:afterDelay:"作方法延迟执行的处理, 可是 尚未什么地方须要实现 取消 这个延迟执行方法"cancelPreviousPerformRequestsWithTarget:".(具体可参见系统库文件 NSOject里面两个方法的声明).html

可是 咱们应该知道在什么条件下,合理使用 延迟 与 取消延迟.ios

延迟 和 取消延迟 应该 在同一个 事件处理循环(Run loop)里,否则 是没法取消的. (以前 不知道 啥叫 Run loop 哭~ 由于忽然要使用 取消延迟执行的方法 才了解到的)app

Run loop :通常程序至少有一个线程,那么这个线程是主线程, 而这个线程上会有一个 runloop(负责全部主线程的事件,包括UI事件) 一直在循环,就是我理解的事件处理循环,它会一直监听 是否有相应的触发动做(人为也好,内部机制也好),有则会当即作出对对应消息的响应,没有则处于等待状态甚至休眠.那么 我能够说 这个 run loop  是依附在对应的线程里面的.它的生命周期随着线程的启动终止等变化而变化.异步

在 苹果官方文档里还有示意图,详细讲解,我理解的"触发动做"即 "源事件"oop

    Runloop接收两种源事件:input sources和timer sources。spa

     input sources 传递异步事件,一般是来自其余线程和不一样的程序中的消息;(基于端口的输入源,自定义输入源,Cocoa上的Selector源).net

     timer sources(定时器) 传递同步事件(重复执行或者在特定时间上触发)。//若是要设定NSTimer 要在当前的Run loop 里设定(通常在主线程里),在子线程里面设置NSTime,要获取子线程的Run loop,才有效 "[[NSRunLoop currentRunLoop] addTimer:.....]"线程

那我今天用到的 "延迟 和 取消延迟"也是一种定时器,应该属于"timer sources(定时器) "类型的"源事件".因此也要在当前线程的Run loop里面处理这个问题code

描述一下,我使用 延迟 和取消延迟的使用场景:orm

在播放视频的过程当中, 点击屏幕时候 要展现菜单,若是无其余操做,菜单自动消失,若是是再单点击屏幕则菜单被手动触发消失.

那么在整个交互逻辑的过程当中,从展现菜单那一刻起,添加 "延迟方法" ,若是是单点屏幕取消菜单,则要"取消延迟".

代码以下:

[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

相关文章
相关标签/搜索