国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于RunLoop

2019-11-09 17:53:47
字體:
來源:轉載
供稿:網友

1.RunLoop是一種機制 : 讓線程結束時不關閉,而是進入休眠狀態等待喚醒.讓線程能隨時處理事件但并不退出.

2.RunLoop 實際上就是一個對象,這個對象管理了其需要處理的事件和消息,并提供了一個入口函數來執行上面 Event Loop(do-while) 的邏輯,線程執行了這個函數后,就會一直處于這個函數內部 "接受消息->等待->處理" 的循環中,直到這個循環結束(比如傳入 quit 的消息),函數返回。

3.OSX/iOS 系統中,提供了兩個這樣的對象:NSRunLoop 和 CFRunLooPRef。

CFRunLoopRef 是 CoreFoundation框架的 提供了純C代碼的API,這些API是線程安全的

而NSRunloop是基于CFRunLoopRef的二次封裝,這些API不是線程安全的

4.Runloop不能自己創建,但是可以在線程中獲得(主線程自動開啟RunLoop)

蘋果不允許直接創建 RunLoop,它只提供了兩個自動獲取的函數:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。

線程和 RunLoop 之間是一一對應的,其關系是保存在一個全局的 Dictionary 里。線程剛創建時并沒有 RunLoop,如果你不主動獲取,那它一直都不會有。RunLoop 的創建是發生在第一次獲取時,RunLoop 的銷毀是發生在線程結束時。你只能在一個線程的內部獲取其 RunLoop(主線程除外)。

每一個RunLoop對應一個線程。每一個線程都可以擁有一個RunLoop,這也就是說線程可以創建一個屬于自己的Runloop,也可以不創建自己的RunLoop。這都是根據程序內部的需求來決定的。這里需要注意的是:你創建一個runLoop但是你還必須要手動的讓其run。

5.runloop和定時器

NSTimer 其實就是 CFRunLoopTimerRef,他們之間是 toll-free bridged 的。一個 NSTimer 注冊到 RunLoop 后,RunLoop 會為其重復的時間點注冊好事件.

例如 10:00, 10:10, 10:20 這幾個時間點。RunLoop為了節省資源,并不會在非常準確的時間點回調這個Timer。Timer 有個屬性叫做 Tolerance (寬容度),標示了當時間點到后,容許有多少最大誤差。

如果某個時間點被錯過了,例如執行了一個很長的任務,則那個時間點的回調也會跳過去,不會延后執行。就比如等公交,如果 10:10 時我忙著玩手機錯過了那個點的公交,那我只能等 10:20 這一趟了。

CADisplayLink 是一個和屏幕刷新率一致的定時器(但實際實現原理更復雜,和 NSTimer 并不一樣,其內部實際是操作了一個 Source)。如果在兩次屏幕刷新之間執行了一個長任務,那其中就會有一幀被跳過去(和 NSTimer 相似),造成界面卡頓的感覺。在快速滑動TableView時,即使一幀的卡頓也會讓用戶有所察覺。Facebook 開源的 AsyncDisplayLink 就是為了解決界面卡頓的問題,其內部也用到了 RunLoop

6.PerformSelecter

當調用 NSObject 的 performSelecter:afterDelay: 后,實際上其內部會創建一個 Timer 并添加到當前線程的 RunLoop 中。所以如果當前線程沒有 RunLoop,則這個方法會失效。

當調用 performSelector:onThread: 時,實際上其會創建一個 Timer 加到對應的線程去,同樣的,如果對應線程沒有 RunLoop 該方法也會失效。

文章借鑒:http://www.cocoachina.com/ios/20150601/11970.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 栾城县| 苍南县| 都兰县| 阳西县| 循化| 贞丰县| 八宿县| 汶上县| 扶余县| 和林格尔县| 林周县| 青州市| 西青区| 广东省| 南溪县| 通化市| 邯郸市| 满城县| 准格尔旗| 广南县| 长顺县| 巫山县| 青川县| 南昌县| 宣武区| 临西县| 凤凰县| 万全县| 江永县| 南汇区| 富民县| 宁武县| 资溪县| 沅陵县| 百色市| 拉孜县| 宁都县| 藁城市| 涟源市| 星座| 天全县|