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

相關文章
相關標籤/搜索