国产探花免费观看_亚洲丰满少妇自慰呻吟_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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南木林县| 临安市| 田东县| 旬阳县| 长治市| 育儿| 清徐县| 广水市| 高阳县| 修水县| 新泰市| 双流县| 南靖县| 无为县| 三门县| 焉耆| 罗甸县| 东阳市| 东海县| 乌恰县| 湟源县| 黎平县| 平凉市| 白山市| 永川市| 米脂县| 余干县| 勐海县| 容城县| 兴和县| 阆中市| 普格县| 锡林浩特市| 启东市| 大洼县| 镇远县| 闽侯县| 南阳市| 沂水县| 缙云县| 武陟县|